Rar!ϐs xz#Fz:=\3CMT Ձ_$OdJ OMl1؊(QG,>sVnDڼ/vrr2*袊(/꫾Wఈ#`=' ]1/$eLasV^eyaֈ;D [qƖX..8N)pM6[vUz\? ͖CGtD*o`'}x%-ޤ7 <cuFLcK*8+eRZjOhω,gqXE+zT:ǹjAߙc\m%[||O G*(ʅ]oCA3VRs77mt' ;0amxmodx+t/ ;0amxmodx\configs2t9W)40 amxmodx\configs\climb.ini#First field(Status): # ns = Not Started # st = Started # fn = Finished #Second field(Event): # 1 = Spawned # 2 = Timer start/stop button pressed # 4 = Stop #Third field(Command Type): # sc = Server Command # cc = Client Command #Fourth field(Command): # Command to be executed. # For server commands use #%d where target uid should be inserted # or %s where target name should be inserted. #Fifth Field(ID): (Use User ID whenever possible for fail proof operation.) # uid = User ID (Use %d) # name = User Name (Use %s) # #This plugin takes a max of 30 commands. st 2 sc "amx_godmode #%d 0" uid st 2 sc "amx_revokehook #%d" uid #fn 7 sc "amx_give #%d item_longjump" uid fn 6 sc "amx_givehook #%d" uid fn 7 sc "amx_godmode #%d 1" uidޥt/ ;0amxmodx\pluginsxt<ss;xc40 amxmodx\plugins\allchat.amxxXXMA [.ha)t |S xZMl\W>c{d[M$U)S%AZWMx&7g~D)ea,HYdD]D(,"" " 2sߝ7 t{{9{}o baѡ0QD\7󯏈rr]-7mcLbDgbQqT9ŋVwÂSܥ c(eFCn`ԭ#őb[@u t*#UNnЩz5N)OuǥJaZ͏P* [ /&90nSgv}64?)ۡm/!qE;C2aIX2!CvLĒRW>V=%>lK,?ɥSqmw՗VcPvV۞Ƹ}K6qlqխ-+޲7igי>Yh}'9}^kjﺏ}g+;N- ϮGߌ 8tA|A\EjhZRc}Eۂkwugc֒)˔mݡCsMoh6,W$}\n|K]tL,+lQ=[=h|{}{$wfXp:PWܮe{kod~NO}d^lH.1_ayqvxs א=od,^QDvxO91Imk4E/xfGH,ȮX%Jk'{CIKٛqc{õ?Ǹ̜K~xrhxe9ƍukc`/8\Lz|yoŗ326p3jk?ܴb!Ы6݀56R5h-^Hq:.57xq0{e,ɞr8gNyzɛ/D)_/NⵣU>6^s^ ^#Ӿ6LE¶n.gw^~wOuYFW7nFϏT9113< ("92i{4﹝X[{FyO#8No6\R^xk4x"ڎ[6z eWihDG\iIe1k]0MԄgڼ /LA}7m$6h=N[cG6w6,7Gҷűs92:*ouŋmͶL؟|اgHk*y9,xA]qW?\W=W|R>v5+/wTQ_PI.\.!.ZWS'}r<רQGuAޗ䵾+2%ca g'g)Ԭ>Vˋq?|=_|fa~gs Z]۫i[ݣ|b)j;f+c`5Vڸ2>gmLs52/Y<cVjxƾzu_mqjϾ6?jfiIgÜ3/{QijD`|GaUn51+YLupHy~Vhk:;bôsjd@ ;%{p_d ,o?_ KD0~qKD2D%EףQAÊ=gϓdp_bL N$owd_ewmNr/0^P!;"OLdba\d7.ͯ2fmnxzycx_eLt&:evtowJ$8D8mĊR̆[]-qⅨ9Q ?*=:1&$z)ISTYE .2~dk8> & ?T cg| f|a0`GtMKGcjPMϸ5] |i,_ה2uL *M\KWJEUɤ'ҕlut5^N3*su:]PW*Ŵ۸V)dJ*_҅L@Bz&SiaUˤVf󓪘V匫z|)SeJt-ocB':{܂&”;L3'|Jqk"<&7Rb>H/b / FVޮ/`gގ-)CP~.} EMN9FX>r0+܃yOO}YA>Q^}lw|cR'#RH>.RlncgYb'7/NuǸM?doȿnsswg_oZRxʖvlY{l/߲ԮW9~[JKRb1a~,^oW8lz:)>|^ƕQp z_{3G1۱Mh[//_>KMoԺҶNHw{ߺl#X?g.H<`ꁁU/\3r \_'%oy2@ިS4'I>i_IrVĿa%_]m=}\Oa8[v_<'嶹L#B߇(S;]0C&_D?>|:;C}Qza]Gd~oˇ4LCfM|2wYݦvEKp(NPQK:H.}a7OPvu=)0.r1sRb{gg|iI xA~qޏnV~NdηQö~[G?Bz1L~Ay?~1noKoސz87P/?ǝp}n m[x&DA[㎟/Epݦ狄/P~lW"1oR$˖/[nuhTiq3fkrS/٬|f OGOzsM3?6?!AlU9^oL> 9_~y| E;o+4>){~s Π<f[\ߎ[ڍl7Ol8qqqznv>>~u*prxRNw+Hʄ::J=ᘿN'D|OJq-I<3!1~>V6$Qqgis^F~i$m0^B_ż]%9wIA_Cׅ/σi1 6͇#C~UK/+E{GxUkRI@儔9"p)?!'###9]\_83Tu7XG*%/#O~a·~u?Eŷ۸.JW(7c1">W \dwS(IwB=%%W~ilʖUG69$oȆY>J 1sټ&{031 `O `#M#!љ?\3ZC跥_tv:#ծGII}^< uf`V/簤ľ ͦ/gN9_Q$-179G=Xu֞kYkv6]kp: .#d\ނ^hv%xIGYOɫe-WwB?Iɍ?>qSѧjT%\ӯ7xpZt!vS3s!*N&?w!Ilq^?/8Uv jh;FNU:TK*̩!V"yTI Kl@2*-HJ $=Yi8ӏ=E"}d'΅WO2oj4r%akL5lHo3C;!88z4\>ԹgUӔ6}[+p07/oh .W^"_ h<spy\c\Әi_*x1&z`1\4O<71֘1!X}\+m̙Ɯ? 9=n̍5s b1N3)]qhN3o·~I6AS|:Cr-5]_3'6c~Ac̟O1R; e:&9g E_74 0^Xx +_x/b匫f"8ntrƫoe:ocÌf27ʸw0Q)0V0V12d|㽌K0㣌` v2)=<$Ʃ3c8'?uA_0o'ቌS1V223v1~Ռ_`|d#?a<8(g<2*;{!Ƈ(ޗddZT?~, x< {0c,,4oifw5ͭoh]omi6MsZWGo_c߼^jikh隇ݍz[O[Kg_}-Z:,?z:;[ܶv{^_[goK]-=tcHBw1̣IƞY-ͦqN C=J܎_t5G,6"h4֓- AK]]}(ymfvWOSwk6niGI% ږMB=\oty52 푛֖v6{HyI(ho+2imlo<{I=D_T-{{%mkA)lmIf t6?;,}~$i]mhG5͞#t9t DVFtwwl۸e~`#L3=$M-M;׳=JO_So,dBvê@Ս?T}--HhzZ:[̼NlLΛUj/8 94׋w4N3)I{ԐQ}R}=yyR!Y?nt2hgm} "e~ޅw8Osւz*zZ:$p[)Lʂ*k e]2Iӻk-٨4{Y9݃fJIx%IDC7~w႓tjcf7΅]r2pe[ JWRG_KX}I=i=0LmDcm(Ɏ* 5[sIԎ.' W;:Xi㊉v(BɎ7X4~g]ܻiR%K+~HIu:JS A%>s`>G{ԷS̴T~54}la~^Ϙ=Fݫd˗Xl]]73'ٺ )֥,\#OQmL<ϯbG%;_餰ڽ&Uhm9wR T'}*N{˽)Aq<eYMpLq P,N΂Uu0.uOf/͑Nޢ4GE?O}29QſkߥGOquPcO=_3"tǤ wIAs͟hRm~IN~Z&sIF+Ee,yT,Lx,NJ/`݌QH}!M=/c0I]gXS:9ÄNJQ|SRJme)VO9k5+>ջZY>+g-9l; Up0*_bIVge~p+S;?ԯx+֯N4 [WtaLY)l6/ns$c%)NID˶pَ` Oi ȶ4lvӭymOc(>ڋf蹈tnsɳ9o%~|FkgX{/s0f} { (0y^L2G,;8GUz~kO<cBp'3ϔ:+3=$se NKEm'I'@ϴpн| n[gsgzzqObB;+;7=s_&sYg٣[VDGg(u|{7|+]V1x<ϳMoשϬ68xဝ?|L~~ y~'|  !H|7 .J_n,4Sr5::ҹr7c/G_jRq])Ļt\9{í5WEY}9Aƿ"D_w>燙Se#sL:Wer']UOø~^ƲHEr!Êcmuc]z_OXad+нlG@j^xexYV{ۻA79N~Nu,evr?eHlZs8 F+ vM[_i ~/F?8QR̥,{up2ֱ?Z{CAu!sَI1wu{leߎ 3Uw֩4|׍@O:]o$fܘ_ޖf}]5Ou:d^w\"7Al@$7%*ҁ+~1c+RcW_L#ϱ͏ǠZ Z~M{ӧ7|G6҉x'ߚa\E=$?m z6t_i56B/}_ՄV;d;cVA;6ݔ:GMi(~~d^ޝ>yUt@.Ι֛Jyt_r[i&V7oR+t <)6{6>ӯKx?\?ecV_-6~mݷZ߭cǃ ܟҵƁv*.#=Gzk̩&xouȳ([GM0m|m ;_jȍF6 ~^?ErXZm {nJ}Dô Lg{6 mU>04p;쳠*ˌnH{j=Q_@a&9~n5TtKI/9 J>+GA8Tt[<{c9Y\W2'qss(4h&l&3} ^l}^b]U|vy09ߝGM'oA߂|;:^SϰJ7#&1J&[Spl_lJmfdnB7Z~]Sj/|ux'+o_d=ѸsC'jZm]gԾՍݶ"ԢʢleX\6% لOP&.![6>^gG[dx}R23KY!,q7ol6>һ/oH/cHFW_G"c6e+c6z82z!$&Jgq]gE$/V12ƕ1=VRmU M6^Ӕ]M1!|5&}X\$sr_\44:vlkʃ_t<>_hkZG'GŎA:z\<:\þN:t8-\l;:k[mm}LG4n;Oܸ8L"d_c1v\f-f{Ļ3oߵsRm_aGTi<4={/ٯ,g00 ɓw-t __2W[fG3;DŽ}Ϻ6>r.5#ϥe:ٻFRmm% 1sr:ڮzu=+^_gwUOّp| mqx88 _#uYgƘ`TdosϵbdgG? B͑yVTKxT[-d>Am$;9ŝzӮuzVK:m[<W[ Nmkdu_x y6|-tb{ٱϸvQB飲zf;ZG}t_MmkNwķ'^jm{G>wǭVn3z{ץ̄e%^WDSX{?z5Ӿ82Ŗ#\_.S>n_}l$a2a /e}~_8+l?З#ůYKrEo>.xUltOzZO]jx؈۹/1J"=͟Qx%BxE_Se}?'>ݎ,ˢ]Zko[i; .*qVܣlflf>f WQr$l"ƑA|'C_4B-L3>"MP>E7V"Kзܾ`mS[";ܛ&>puّ!޴J3~M8SceŜh.qِM;Ӽx6IQuye\{߿1aHsUz?oڻ<kLnEv#vRo d1eo|<]~͒ng : k}aґ+1Uqٲ[&<"4|=+}/|w>DҖ;s]xm֍TL֪{|O޹z1~`ּ_ӗ6.,wߕ0 i8H67^KSM!ӈEo>o/mS߾4eϠbx gqv|.eC?s[AI-ɲE_YEEyFuP1QKWsT^s{}˘VI͎Iʖorw=:͑qC~otI7&SS\dy4qS؜qig3'=ͧ'z<1ݮ!{UHDS蹍۹%.2qwu]q/̢wZwS}+Dc;l}wX~[a&Jhkϑ7mSګUyl_N~ *wjOʾ[پ- ̻@7xVR%%Mܲ-uHʪVt_tI14zz݌d zY+TLcxv oc=]&5+le˭.gLe!]ǿ?x g[clOi#>GǎfkNſd~&3|N?uNiԗ; z\l}Zbce {ХۃxFnw{~Q<{~ u[ {\l"cYwSך eX_rN];K: q̝R}GTvs~l6Go7Q؝ã .fU+Sd}o2ߣbogJN%BpG% =ҭc#m t>5U&xPe359e>[bcGBژa-bs&Q˯e|e(._Pܛ\EɍQz8doWf5?-T6ܢ{=ͳdk'r٪1eיԸ,4$ܙAivEJfw;8p-W:(vV&NFs/vY)zot3x9EPڪ|wе(#C$I#}x|˜{실9J&s;G]o؍}v,-2_??`cNoi *&mq_;>p~}Og~ۡV&lL/qi/n&g>47!ۖ!.]\C]+hޫ |,8)xTM|}Ukh;3zޓ^ϺzB~Ah$uU?:¥* Ɏ;Ť>@cNؖO|ϓ1'{V{*[Y| =zH%bA3[j~<.L‡R GzX>)!~˸&}C]ܙ|nMS(P4˳#?-rh%iDP҇e~ӄֿec}#M`>~ʀ54uc3+רh ̰qM(4e]Pk26mBClCڢw4شv?ǘΆ$+s0ZL6F{Ϥk܄G.:Kj\13cљ|UŜc8q+b=oɒsW<ߧw˟8 jeO[gJW{uAyvPNdgZ֬ͪxdZ\̼V׈Wëu-G'2CȞ%kt/lUd}*6:eWm}ORxx/A>G6?wsc^71ogm+LfxmLU7<뵃kوygݦ<;#LcOӦTn_\<~8rrId4,y WRY i֚}%KZw,'4_akG{gl{?=-d_S,>ACuv,>؄h6 V>~lrS~؄/رɦ/رخ[LsEֆuKy>M7~Y\[ozsiF9>2̵";J{Ş3Pz vt4N؄N رl;ٶeN7O4zP b\i?~|L>(ϰwD\||Ͽɶm_J˔O ^;DomqɴQھGmFa^h.GIg_;It<w=+vKk:}e.:HW68}|W/<>Mыuv_':u/$マ{tr=Yۓ~JBL=:ߜ`%\b2? *{d{1Mүo#>ڷ%j}[W x֯SG^r>#GҍhZFGN_Y6S`K6\ǁJ _4"J5B-ҜͿ^҅_10X4=AҡK*+x;rh$V7[fQ:}SNO}=]q<NQ3cs[w>󠽱[e^ƿuY~+eCۥ%ǁ#RɇJ#SftPx&gqG&sxs= kA'y~|ʳz`~G]9wtpEbavۧbHE ;8U`$v(iFL[ciHKS[-Oz^J<%>_; i>_}n6e˾]O73Kt~osSDvNsْG;nO7uPxwF{+s:,w=G6<\ʿjk͒nm :?ݢG}-]UW{"w<?^~OEk>r8 k=k]:OWtmv_u}b%5~O{,d K#ekCţ{X[m{a>XeJݮ#L%k\aPۓQ׸ǢŅGúng=m}nv ^Wtk$2lm6Wgη7lp5ְ=[[5n6|ר|#x- Umkrc%.[O9|~oj1vK/ (s}"A*9NPoz(Jm ."A֟|E0/= ˤ_10J}Tcm=EѼA5==sO$UW{foBt])4b%_IJLw]1t~~;!:.U߅mEH__dw FeNܣD^̟-kqzBT!Zs:T $޿ =zs=66O_?Ƅav}~@JݯA{ĥ+|V:&-ڕk$qFC ~#]ow+싪s46kak:}M:!ih O?t2Wο!iEJw#Y&xR%:UZt~,銳+A'u*2"$kL핅wٱOW%]k :7{8ݣy&}6ӭȒn K1DGhuTun6EțH7G,[?t{bЉNJI?<&8^h2㧛%]]t Y-ʒnU : {u{շ;FR7k"ʰI?ݶ,vǠ2}_'m9Yy8 }':O+ / /k3i N4r])GݧY-V~wJ+uDxq-?oR:viJ5:JAS2uG9Ba51)E1lR.щSޟ<2wIO=m^"W9=-ݘ"A?M`< '{'=fqY_D_#]sq~v{w.KޗyW5Bs:G/3HCGr&+t#]sfeZ'$H]Jv˶`SufJpor^jUyy ys‘3Lcr>Jx>V}gOѬߑ}[{Nް>qc}t}qy)Zo GZ9&u?~g7pu}tuQ۞v$@_ ִC]Nj=3~^AcU7FK)/ӽOMK^[A-1|CLיyzo?>iHӬϐ_7d~RGoo(K'zy_^b^8#}ڒ)Y0OAw'o&!fhL1I=Cvc-R}?ʣfgfn[ [_|YŲ ^D6{~w9CݓT;ݕN}RygɧD%Oga̧L36f>~>[SmAw@wgSlm,fh_G?%߶K,3v,T=~K8:\}R%NRfl'uGǟL4Au&{lh7VDp;ű%:ϴ7~.> wEק;&XYs U'Ac#?ͦt{ns-+?ni6nԘش%Yy43o jAs8&5]+dmvמ,2ʰhe|?IlxO/7':σI[^\[QnLP[~}I. WreX+ޜhoI+=;kNcЊ}>k%]DXZr *_΂ڕnAnk}1 K,ۣlxBcY=Bu5%^]~f^o&,4v?yI\Cㄉ#n1C}D\cY?/(5vAklƾ3xlS9t"& (cA~qx\24)c(Q~G0oQlttp05ɫ< 7^:Q_yI>x'O>IPn4X|H/4vA겍O#y{}_2.b%j߾2`hpqS~-&J?ySƿD[ʹO^ g <6᱉id9 L% 0i{_Kv8>.YmޝmNy&>m}V#Kw[4|2w9|y4+8* Cc|f+n<&3mX?]463m"O;4#Юuh̴3iqiA:~V]=>3-Mմf0mC[ͿMLˡοG,ni31rǧob[:)/o$nۖ%f[Ř4:|W3%R#03 Zb^+vøymf`\Xk9+L3uiR_k_5ͿNLsϦ[y*3YXڲ; 'Ywןl4WmrӞʿedI?_q0uZ+\=]+l|^@t%ݩ)se[T+NjLں,he̘}u|M)CcT4;7\<8e=bSLOr̛̿?{;uu{^r\Ne?# LzFw+|;Moy:;o8O6yjw_hbW|* ,͊F՗]㤯equ6,(|^F糞e<39sWR(w:T}UJʫg1ˤ, -\{LAn@ mpg%q?q6L08bg$܇SلJ8!Hp`p6"1X?v ;rG#wܑ;rG#wܑ;rG!GCYgL%n8i͍.ǹ 1Zo:C8yn8i!cq6\s=wܑ;rG#wܑ;rGorܑ;rG#wܑ;rG#wܑ;;~{ wܑ;rGw3}Zmc}ƬbecN@V`̴ 8 TS0٘8iLQƔ1S5f7ugLùcS}1'!ĹdcfSz bFO5%LM .Ĺ4cNa2ɗqnƹLcjJ[ܑ;rG#wܑ;rG#wܑ;rG#wܑ;rG#wܑ;rG#wdqq8}d^0u<4?}縍A$M𰓾KtM^#ᤛKs,]o6Kӷ`yr.1q#trZ.+XF~O'01 Vc Ͳ^gMr7E{9\|ol|,g`Ts8]Bګ6 .FеksY/]J>{QH`:]QC6k Kdo_8M ]_lTڌ/0Y9al:cMҤڌ0I[6֏+>w>Q|I0_j]5ٱԡؕnٶ(<)NܺPMWi3Z/U!+jR. .hE ?'Ic9w༙uv &\*A-K#Tć:ſu?.4 LK|,1˰r&r)7nXo-[ݛtmK^I,#rKy=i!=Hzgd8]X{klR,ƶ qՅg1v%t;Jg*7el+>l=uۅe:^\U^t-czpzgmMWƨ"('d{|;Mڵ K_#:v1ܐe겅" V47H2Bi/4s+]L/o3-%V8Jsm~ԕC-Sҋve гխC7Xi|dto6>̎n2LƤ2Is=ܱody}[={!?:Qv>J/_k;M8rMus)XxOeNLd;MS7O>НIl/m ֑aHǘT?/tct61(NKߗ0F +:y^jOn{;֌"ܿJ]C3_L71񋺿v\c l?sR|{\ƹ\n.2QrL7=5W'Ա]?ÐQe;rҭYE~ϗz,<'i( H5r'_Qpv2BTKaF2#սW0fxA7# Ȝ) S`%%h}9=٩pQ ״ԲI_$cwA23FMJGU%CACG„/]tH+pvǎGҾf׾j4tR跻$(>7S/7m Oka1̅Ŗq<a{tFk,AM{?:25эJp]\`ڽ\ʡAsn&c{s#dʧl.tMl'N^^u8^hd[Y-nYE7 %߳]1RzmG$ny7]CJCץ{MWfz+jcWhezcךE?buњ/)߸6hjMe-h+-7_t-=o&ӭ,ԑؗ {qɆuQco_ڐ<߬te}S&rM5~:$N%Rg:b~Xdj41G)=?J1]oL+qs!s?{"hϲYƟsI7`?3ne &ЂzwqwN+cO\zFX3in|R/c-|/N ]tY#1GwcD/W=1ӝp&sMtCW¤d~~/"o;/.hFC_q=ܺ9?16vjgW] StBYQ9qQt-:>Sem}r7ž3>i)رnqc!Y+1YEs~"G5ɣر-8\s8W\sqx|]s΍87lom9s8w;q¹{qgF/>~ ;F g;K.6vB/h0ضwK>^^Πg }oq_>`cfE|u&[mVX@GzޯX%u\k$V4sEU&ie.Hd^[? EřizL;r]lSO۞=#mIeU?"u$۵n;3gE%]ض&ccsAt}& K\v?h^LӅO7o1z6 4iî˼O_pX?mW|KpLץ-2}JPNў(sR^䞴 m[ncɵ2z[| ߚ0q@AOp<#w9dn?ݳN5GsF9t@2ƞ<4gu>5^)uJ+Ev)]V[fs_S.N5~+u*@qpN{p=O ѧkO.#Lr=Jp>Qzi4v2J(6f稲C-uJ7e1#kaqWut\Y3'tAcR)*A#1nUWS~ž9Hxmxfz \LsQgz>$}7jws:cФWܣ73#>#]U76fjAqkbKT3'AdS0M9~`}@M-h7qԄ o#.r3>1s+b-w)0yERC]l;sNa7fz13!A|IEiWQ(cáL~pp ^W;4i{}ߺ^_,zI7{F1p!S F1K=h_p/eNY˖tbw >/pAʸ>^':]nK~t|kL=;>#r-yl3:A1ؤI8y^o„< k U?^)R6Yy*cXLڠnY4>FM4#{G9&{W1o4e2?s.apKҥ}貉些.o=O {^? O }Az ut?{9Q/8ϭCJ6>GKKfܤF=)9]ظؽm 56sTzPvDy^Wc).{wZbh^y4ge/̷g?˳M8lc/h~p,ʾ(z ۯ0R}fbi;<ܺV/Ϸ  Gd=sB~ eOhz.6ק뾍0ZVNF;6c&w>982ıts\i!lVEdWsFcOD{/1? |?A(C~aϩdW a}6!?E3ӞZzEۧe"1[Y1AYJcatqd/9>ݽ.L63g?0.nЋ\G&zsG&TϤ1IO{ZW;?ܤ7ͷu:|ky,c(~͍'udGGC ^~z[{KFl7RRG/Kr-Gd|47ižu0"؞_ItTH~a4x]<^oG:߫GQh3Ϛ]kiKԆ}l6ȸGe*A6vOr&ՓYMBڠtτPbReGσƑU:wdz)CM$Lڗ}Yw|:'LkAmF%NYÞe+om>,Hَ5װݳ1mS|LP~|Jcb=Ϩ犃\4:_QwL"٨wg4^x6aO˴+> -2+'ݞO}h%.\K':n21Cs@̝!uclzƾ8-&2ޗɸEd\ sy܁n.yù&ߝpe<[c}n}O^wwXL)OX$I's}Q43)4m6{~I;s Cd@Ѵ1_9Bc߭Uɂc&9㦌9*~+f6w5h^rƎ/Y3:5li?D$]}Ic#BG[oShD-s:[{&I#uι8I -UI jcx~x:fWT9y7.\pN1;t?p+ÔqԱ޻zt?\ * |cN"'x p=T %^T4{wW8<\,#qZqXz87γשho~g<^3kK $}Mo-^Q1ы?k.轃lMyN|1 $$n}~o/h8kGxu=zv0г^_9ɞ[9{Ūɞ'{k&{H长H w=Q~-Gyk{ EZ"EOXE^e1hO3yŔT]}1ݯ?ƳıƼ%T_zv>c=O{~سس#IQ6p\Hf8=?k{x=﵇{~x/~{o}z ל} ݯ9om ^=x\ | \U⽳t+Dcr!yR:s'z>:@Sc*ccSQq J`8< XI"`;hnS=,#: Fr:'=)n=ӀNVˀ3gQgSySpf~R9NO^.&y7/ӿV_ ? +{Ln?C`|/"&9aא#}8o =o_IP:MD x q! QFvX˝T.kGch6YTN4&1.Dci!;e@Mt9$/\hL.%=Qu=;]Mr_NErW|pQ}@g\ |#kB \ lFXR1..%yotAH^;nnFgX|+_P;P}?J̘?L\eC.~v4(#Y`%p?O+ˀ}^_cLa\ Uˍ|D~A7>[tmWw>[@u+e 1'uNs j7_7MvɘޘǩPyzދ\¸/ e\lrF';e 'J'/Jϸ "zoOST~3瀃$'p !M -6X˸8 8 88 ,8 X< \8<Q" V6z <q Nm< q#dv)`voI":۽C)s3R>󀫁S[^"xX,'}/"{1Ɂ4J N x x5 Ah% |9p=Z.`Au$/zʏH A4f|FP;| Z8C֓}a0΢|f*8`y FzR9DVK?`' 8KǸ8xx/[x0 Go&3o&BzhpU7,V=7:A;8pߘߑހvI&cHOwQze,}1%wF'oACEra0o*7O~OScP:LQ 1H=X 6,ŠLxpc)s(HwysDEN^D/VP9/%yWPp:1_Fc^IXX 8xV%}` x tۀxA_E{g7_C $ ln6gJuJ~8ۀͩ-vPz`'j=Tn`/ x N \@K.\| F`*&/I_Af Jb*/m$! .W໩S~88x?^ MO?'} |?WޜNȾ>Nr?BOS9#y2>an~)*_eR::pc 8%G$p 2Iup#1kt͑ހߠn&;~e iuʟq5p ñ&9#co ψs`g0 }>N,ė[j!v8T~ur|~ 7MݤߨLd?'?$/p/p3czJ| | 9 >r}8&m 88X%'2<8qp"p#>$`'hx$xp>x4p7`1kǑ<ぅ_x"p&<Jr}`p9zaҍ?q!l๔?<¯'y=U_8xprǼ5VKIo+?eu?>TM_EkkUnuTMޚ";o`(J|7<[}ہ+u$? Uoj kwg^W`ɻ~`p06/ƭ6*w<%;N]mnCzR=HyT?";MST/{^-X(q`%$!ap g]_:jGGz|?#}wF;?T?ȋ>I$5H(3D||P?E󁛁;ぉw 6;T`! \< rx4px 1'KHD< sES `//k yesUCSD lK \/n^F_#y/^A$>;x=p#0Fkro";;|~8 |5 | Z'`=pg/[`Tok |7_OAG 88\\x/;&;X{ĵd5/.&KHov;? -r{)ph'V4T_SWQQ=q*~(G}?N}m | i'oͼYj'u-G|LcE/7_& ހ<&*6ToS~]'p ~/QwBWvRc,/=͸K_]p7qדKpwD/kt{I?}Z)< +iWFv?a g<>Iׁ${%}Mv|z>>KYoE 8n<8X,.NnN,{6< x4p3&X\ \ x h?^ ^VPzKWJ`sUjk W2^ vk_ ]^q<:| x~{ G< < AЌ;52_h_؏e7ggǴ3'?h?Y_v>M~q` _??x3v,%_J2\KbU7_An xj q0k?p-8em҇$>;><؎_vNЎ/úv݁ob~˱.8pVFm+S`П\wѮhUXhw1N-6i`n-#8K}_mNwPW`>|jpnHMͪ/2Y +%@|Or? 2zXI|v􈟗'P6#~^O_$v'SvG<ɟ2$IU{WX9e{< PqT6w@ZKATFfI_ gKQg\2&Y;bv:fDX呍Y%-A.i-lE|9"Je*EFZ._7CpU⼴J-U+nMUAu|D=m4 uIJ+6lDlR.{\>!8R0p F- f$Zt9}.jXNTM[RJȤ(0qVjQƟ 3 _直jUQ6kͶ-qĜqwޜA]D[_qҗMd`ɗUfm%|afm{2Jfe ui;RQB k"͋u1)'T# Ư8SIuK[iwٜ2\dVzY4J veg#.BT.尌Ջ*.!X|&whZ.3:Ò&(/wqzfusfT}َ[ Ze;E6r:DK[´Z,pkyI3BuvIة3">"]Uv꿬g)罷vagu#+5r9nWӰrjҧnUgѪjGVX{{Z%;ԳY5+f yt8p2ٹ,Wƞ꽬el `VF)*4ݞA7xwgk[L/E(uwE߭nپv=f9@UǬjz#N\LI< )''`bMNH 꽹KЍQGe*2}9;OWshA:LY? iܳkuNp'^]3s/zҶQ^"'{elB=X'a(vq q#uYYnfŢD:Sf';>ڐy;-TIY!Zn*2cB xTTF5"~f}F2XvMϭHϤTUL2K:y{JVB/uA!uZe'3F'f]uBrXmItūbCgJ*q\eG7z4Cm-|zأ 71/; gӲŸ85M;lY4D>|G3,e~2Ť3A?hc1+t ЌzVl;?1 0ix۵޲qē>d;!u25uͧIᏨVsR/)R㡌tK]?fkTvj❖dJ; W}\Sϴk6|lq7kײY.k@}2\R[ i{[gX|Z]$UERa3M1MK<)%鈕F?4yY$32|ʕW|R6etN,,׳6Sբz[VZɯfI9d&HO;ϻlV{Exs.E ̉ϹTj'D:;9a/ABKq.lD4+gBnۚ ׉&abM^Oΰ$ͩN|yɂڅo_T5:f^gy+ *kei){:aȻ Yt$2hq]'5uz5_JzD#ꠚ4EV=]hTީ@xCi6Xd xM R0圐ǾR񜐂y!C_ )Z}?']1Fד[v[1tzBF-[FHUg(xs*p[4I\Q~19g+^28I~-.V]bi6:Ϟ(Կ2%^!u/Y֫N"bs6Uj)fyv\fCȀ9~ER@9x Bhj^:vO|?צl )8R0U B FϤª^Q=mK!;onhNJ^*;%2/az˨z z{1jMC'Z -'naEqWݧ I=dre%3]f+_?_rOB B %R M>lL.,E*S٬`XUv /{i_XG{td^#]w$3Ƒ֜;UB14dG^'=z,gMCzI(=nkԻ@<-oR@Y2M0>u"~L[:F־ܵ/3Qxd31O (G,kMW׽k}R-RfuWYo mC 9mq϶dO695Ҷm1O^O`j mutS N-m L{O195RSrgr<7d+srG0ެrZ1]sjD,Pz՘GH{ܨ%w ZIr@ U53Dpsפy@HUOwK-)FNSC8m s^'ɴsj]3 ~^FAUKT77I'-5=V.\H%KNm͙dCBժ<g$;UkJe Ł]@o4$7}wf̦M".XgO:]fu6uK2q^e#-K0s$j&GÏ&w+.9] N(JGx=-S*?:'Hˉ%E0!XR $P,&91)t¸ zY3Zb]ũZXK3wuF\CQ@+B9 SӖJF„6mv-Q^n1i+c 1Z7CLs6iI~v&IsO$d:b3-y2A(a"](W+n+g0Pn6q+cAy[C-]McDM82‡gd(4ۥPs=9s%Yjt}- >NW2fDDӝrVܚDu:鑏sI}{L8{%a=^O@ 7e8Rfb4keFb;{l9%;78a:=s\&e|<>wLk2-GU;!=Y`a0q]\`U[{Q ;nuQ-w9J¸^RTajwjZO̔u- qs!u *#=qJ\Gc{RPX0̇dZK"[ wAnɝSyZNq\:ynyIƌz \ 'lFd%J.b I5s%d%.O= xz.ocH,OwiP՚[ l0t3r#.[c3Ean}7'{} SEis"Lۜ3kN_fÙfAuB1zQ|7!oI=pQkޙǏg.J3=حTYZnJU9q;\ .y(lm)fByq6BP{c.]m.Udh_#Zr>5Xm C;;Zs%\Pka} ZYinL3+;*߲[톬kԛظuTI/` ;'_+eJ0xk\1ʷ?TW MU1XhWJ*NJ-ܷ.h$?f<6\R,Q܊鿋..jQMJaI6]\郧 7)Ehv\tٮ-a霭%z̈́{RFe .Kw_d7[}qn*V {@<kLE<֞sME"eybWvi{,pw]LQ],rM <pQrtHht6v`3 ml5#E| 0bƼ^x-hT01뢩I `ؙfla̬L.7kL\aD*Q mWdfΧky9lӱ|xy<& {esy &X\%7O\+'Y*t͚=e_ sԸo 172}}v}ŐL?vMkf{R'~]8x |eE?f (e1Y"հ?VF&tNB45q#i3Kq_ͨ3qaP[Խ[ORޭsԩSέ[s3TU햫޽[=r;PWo.7zVn!sn!:]EI/)I_.MTx[n͒wJn;$=|%Ɵ}?%Z ڳm-}clk}{MW=ͦ_cHzϒtJz-6}kfJztJzq>>$lKҹlwM^[m|O1Ɵ/k=>Io |о;lAϦgx?IO|>JzztSM*6}~cK%=FjI٦o},?%=M^6'ot_'ѯ[%&~[m>I%cӟtOߐMצwX,kmW9ݦ6IQ-e}%=/[IW?GHzD'驏tIX|Jæ/tjVIWƯt^IOi%o sh⹄(QJQKgJ'A?R1JW==>҇Qy>/uH[(}'(}/G)EJ+@RJ>s)}2ϢnK)ҷPLIJ?)n`z?JF(}&/t#t(jJ)J_(}JҿC(}8n(RJSz_CwPHORzғ>SzC)}O )@SL)} _MQ4L)JSz)}wd(}i~ϑS%}J&IvIxo$nIkݼ{sgWnÖ۶n\Nݝ][s;ڷ:Z67/D_k>/v߹{cKsO붾vlon]uCo{ ֽukkF$7vuwu㗛:lܳ^ BrQ[mIͭ^U6wnҾ1ukvm64onjl_zO]&ݺ}#^P}K<.mڽ9~Ξܦ޶vhGvO]^K<ʶ5wnl6mbb2m=l[<޺%ѹCٱmBξM^C:<$}[:o1y`e_Kn޵mKk_ 3[;oy\V׾IW6u5Ծ-ۼBiiNĖm]ۦۻ_})[[{C/{oߔk>Џ%+>͛z 5}r+ ׷!PרOZ=?[{ֶ-]m]M%ٷmڶN3ligbc6fy^< lܶP{f}}^wmۺX㽺`mރM9ouoo6?Kxmlݶ7sf+[!a `}U.ŲkN[bsk{_ڍd^؟=>Ѷ0Awbb*7NAc<޶5/վE = >^0벍rus@g_!}vAzRnyi^P9?9\R[ 3oxp#;[ڻjܦ֛<"<,i^/vZZpwizaڽu s|vX.gbcꍌ/(ؾ%]2,%:i/[o2GxzSۖn[N췺vkk¸W4_a:{PU۶^޷mש&yӦSO\}+(EʭyXұ4vzltOAܩ(ϯAϱ%>F*e'H#?uT5:wKΰ[V ?g{L:OM1X+|KtlIZc\#$<`cKz9d!lv>W ~d ?t#̋[:nkڹՏvܾ%cvp~[`9+/qbS-n`9ΓўlzTO\Ӓ{%D?9C窟隷{t{J x_J!'uOO{)Pӂ</肛[o{T)0=XC1hKH^??whtktꝤ,O=k~ zQ=hKϰof7ՇOA8cLgxtb~zăDk59[/m<`9?1<"x>@=arKv.OEyrEqe 8(?bG?_l9MN,'5Xo^[]g>^`w]/|j]L3_яװuXݷ؏=WA}* CYew妔r!=ƃK2~9mڹ5¯˰rwM.POr| =;"}F6Wˮu7ju6H_WˁGno.Q' gb~VxīG^LJO9@\/Gq3Z!sg&eZ'i`ҬKF<Ճi|bz0\%ǭG_8ʡްEoa8~YGi]~qٟꗸ,G='YA{\(t~pڹ^|^,L}ed~r>{u <y%h}.EinC<|*tGs=~J<у&?}S(zJc Q(7.Cq% @_ e1߰_|8vAzPotMr $~Rnp>#Gĩ|?'F!cHϑ>mj^~Gi(xehg_H ~^K A4;|||H{ʭoQm+߃u_2)'mע^MTs+C2ߣr}an|Su;?1 {RN.;-/*6Ovr]o=5;D41vE7ϻxC?u :vOT~c|l?܃>أiӗ}Z/. `5?+ e՛˅՛. ֓P_\<_COaZ}q\XB> OAR"_QkE=/J. 5-ljm?C1$_` kch9۝ن }#R s=Ӡ+~%O@~?",G+t'gp|.X?mF~w[#v/h<ގX1oEdHMOt>:l9.k {~_obgΙ"XO[Oi?X*XOG~L{]9x4"{sfڻ,uQ>$o ֳV7'Z y,i@P~^~(> J:y>G͸_O>s\ej"Ɨ0>mC>Qs./k5ayu|&E]w&5wh病}Gq uITN;sM;Uo]0WۣR{/b<~xzX05CE:/]n6f0^?qȿnGuzw7thiT21uIRy&땂,:M4x\xJa/Y;>?uΡ  4߆yog5;}Aֽ]%+_ /4':vgQ_} I~,į.ʷ< 7'Xo܏u3|{y~F uQzA7 >={ H{v^^n(st+m<Zv wlwaa{kjxİ@oOv=\/ߘ_}=ָ烞 N]ﵢ6Nsu}_4^,kQw#~Ǹw#y WkXn_S_P]~|-_Y>PnVҰ^ؗb? c1+rP/_iD`Q1 m495H '=ЎǑx]v\}:_}E[}E{ʵ |) ((xp=z`}6H|>~WNJ)|%>ES ü4`{g/C4N|c'Ճd$gA * Sx+ {~? =L}/ K/4W^e[f=7ϖH eQ[r ad T<_~"|^9kk_?Ca}~qd{b _};H]LnwTW,\N;Azy|3aϯ\mٸڥ}hU=-2{D߅ PMW>g|/Q2/q&Q36;7V6?s1柙xSɿ3^'yuA<f5OomVJ}"^Uj`};Q_u'kGk΢3i;+J9>7vo<%7ڹ b䏥YAfoҽ5,S; >m2ňs;>'h赤Ƨ6CZwj>Bc\/[^8}|&Z]cfZg SOāo 5~]QٽQ#aafaHʡr]o=ُ _㜾k]:.}qy](LK:Z@w=<6-:k&3%oHys9 k ;OXy|Ϫ>^>M+|,,1_ZizQbMρϑ WW-=y]bؓA?JTggWgW~{mf/M7|+_ۍ*]Nj@uU [_8BQ!XzT=2z@ϡ_u#`Fez>/5G+ջ|qM\Oi酖|:JXTk/k Ӟ|߰~'n/C6h!zО⋦!($DO5::XOeZҠuQqAL8yN)7F|[7tq>c?"'D?}0(Q>Fy--?Nџa˃ 1+1~m퀜r?s"GҹLB:1c}}~ _lʗ3s4_GbxG Hx&*%m>GS蟨x]ߑ,=O=>Es};Ǩ\/828kQops=izx⫶Az"$^z5Þ!ݰ[o! j%^(1ڽo=}A' a|.kQ>;B]^F_oiyߢSxtNSz~%=e1}.;!_H-複;jKc~g||_+O΋:{7T_5xPpWK͛xva5y{i.IhUY|5^.Iϰ|r9κK:<䟋;aߗeʇ0tBxQ 9\㟏]Xڏ}_G zI`'^A˭:::>.w[P߁fw _RvGN__ZGMKy?#L͓=~GT{>QKeݚ|+Y{ o]#ayNBĿfA⡗zƏ {|>y)9\NJwlG1 o'\/ޣ:9z}9_z^r8{d'j ˹f'=Fϧϧソ4GhzxR=}a}y[Oig끞C;x_/cwM}wgGW)r}~fϚj̱rھ*}I ~pR\ގ59H|>^MoT^~^HCFz:_:_ gzxVlbC{/44w az>{f8=h?,\$Q38_h]cFbf;H[ jMǣrA9CA6ow\[zyWߙS•ϣPoYZ OsWƛw} crI'گ0q~ϮKf_Pzݮ %éub竍ʾT#_,K ?tKh? Ow#GݿlkƣMuaϑ(n'zR.}~˯}8Wn9x5;6r}4tmfYp9'3}ie g;;XbM>۵*EW+)Ah:M$] MύQz^hm@'o+GPq>'-T>m{5߹6DХى#w,ohC<5w`vMQZH4{xWvյӣkڥQN[H|ރ;m9~G8XQhBcڝ\HB Ywcr#>uT/SEGg's va]/*(tFi3jxx?@“'6JqxyٯEoIg\ޛ&دU{oB';>sgSp5=qzgMj+DՓO[׿<a點ʳ3AnpE׾]#ޮ߆w+^1j(?>kG{wJ}EH?Sf_׀_ygizgPn0n!oaϓH>+'s]⇟o!TJnG;ڹ!4?/Tcݺ`;ʡ7V}e5SSI/ !TXa%~P\߫6[o)}N|9~^S--՛W>{پqk zJ(%W_Gއ:ò_PS\t o.:vIx\@~~z8rYEU,_+֕c>v.)c{|}+C/:K/=s%i]0=֙W2XN}R_ϙYgcS/]>~G̷W7*E~jnZ[5[5ktkJmY[5t$qXwNwد;b^oLAn{}lj=apqz? ؒ7?-+S=ei_}bd˄tÍcvZ?ԍ[Z!A;}uzV!EoMW|&v/4ox,f%N^پ;?+-}r[` +럩 k=|ƿ&9Hʮz{jsAsle oj]rKN=4JthvRkCo_Z(vk~ȯ5})(_)\vWg ‹q:J"C],w߸쯃vN'W/Hźci>sG2ocP/Ke\Yvci}HrSF{ ?o ~{]\rqt팉xz׫, :3&zO|W>=wwӦ}laOw`S}"CHc]/=:Y6Gy˧\auw&;v|Ծ?σ$ARVm)8fz!<}]۩Q.KGR5&y\O\FRSڛmw=1;;ڕz ~nv5Jr_w޿R%z`]m![~]p7oQ>x}Jn8(4Q |zz>(Kk =nF^m==K}ςIMHAqLy0] t.~yG\5^y7!_qs~;ӇzyQ*:qi. !x| kRZ> ̔W\PrJh~~|uU4ϝ ̷dA[OW[a|)q5ӕUςrl._{l+VTJX<~$pل=˕\+T_SJX_<9ʿ$' &n|<.rmnve9I IW+IǯJ| 1ooX׾)Y>veThMT_՛+>%|>KOX>$<e]rsoXO%̇?귦>>x=rWOX>jxO-Î0\V?]oK؞w+oF+/M 2~q2<o_o4&8쓔1YDر~NꑕH<>7}?<%GzFS:ZX~Y!|jmgmf`EdGߏnre,g'{xItL7[ {?F~dzŷ{]}~.H<]Ƿ#E#| {~\~hXu(|M>wx5wiVڟ~| ?1F kܿ2|wSKL]G{]^z·t**7Cx9_|/" q:.t4dKsk(\~Xų4~K}B_/ۡ K/<,`Zø>/$c#(nN_4.v;\X='z+g;_O4:ֺ|Ώ'+S{./μv]z =qzsxM?; ru_X:y=;(])|y"]sXy|G~kB{O &ibgp~b;|`~@{&?֟HX>7cU\Z^꿒 3y=^:S_wv=(iZ\x?'w4}_I/ﴈڧj喽hp`[)-d,7xr .ZG}^rD/ נ!WjJxuDo#7oAZ/ _N>W_x>;tw cd2:\2?F]A'e%-G=Ƹqo-mkzx7qEQ]zu} ^(\= 9v0n]uZo+<=_xviyz^n X.ߕx}_|_8IЗ~[~d<|=49JG]xjt^bOaϋ1kѕ<(Vf?pw}[%|n*&qİ#W[2#j=}zn>g{#(輊Սۍ~]\ծh1/L]\.g{3gowIz]x~ćKyzTkۉ}Gvwz_/i"8|N \v㸓~N۷Qs8^g?k^`.U[gԅo~\w)=G2Aw;;@L0m?^ =bt Ƥc}yt ŤcǤ#*^|V?@?WSmLWmCejV)gySytĤcIG1.?;@5GhyϤwʤc,&CDGIGC$e1"Qx<:&cH+)"T/QtLΗ׾tLG\LI|\hz<:rGG#$eQ1Hy?Wk-}D֩n 뵍8~}<oA/I^~ z;[=N6De'};6DwXv*u&U[}kyor۴[ݒׯw}=&C1Xw`=ikb}2xX 5{2x{9ojes{ ަW[Eg;x;y>{x)2ީ?5!Os%&wƁww<-Sww에xx{y-w4_矑μ[/G =D+ӋsJ;IQpڢ =ՔN^}u5#:n43]j54Pzԟ.Pz1]{Duzy%׷l I>C\G1Q{wtsF7+)HgR6w|>8c<8M~u|V4~D@Ϟp›'=(_wBx诿R KՋ^)r;aC>sBN]ߙ23|o*3+_T\~<>rGoW1)WS]MoW޸/(Y)F>I| /\ډv_Mx?W( ;BoFFRz1_&1?]IqX|V?ޗK)Ŕ\(1BkS#8zhy/?ZI3]=MQc+Σ4ʁ~6b?W\xOEj՛z ѠLp8y(~-OH?SH\"O'$΋_3Zċ4YB,d! YB$ Uޫ?k~x_P%nd=H<(xDb?*NxJisY$y\ ٪gh\iH[HI$$3$jS}g{hfXcOH@,d! YB,d! YBfF>\쳍ɾZaA&~F}y_;'i{Gsm<)g7{^v˱6=='xy6씰t mwKEq;뗸YVq-Tq@m}ĝD/\'KwZ;_Տ4[im߹)\ J򃮣ȿ]br}eD$nIe@_.6%T"ʷbK~J3qIn𻍞ǥ?QK%HQ1D/򃟠WҨ~ԇr>%&V9 |$11'Ћ~E!|z&)<@UzPz(ʇ砷Qk$>i_@D-GyIT"_zya|׽î؎迵&/\? kh:Q?׸N$]@!7H|1Փy߇#yPۿ@ϵ8Nړx|>M_Fc~#t`RgGn6Tt8jl 9,1z{r兵x~>(?KJ.֯Oe#Gy6ՙ<=LiX/Aq >v>^B79 >_{(_Z^/Z}kn>K[^0B^ҏ]tB^A&?7mMn*`hay5,Gl7vƧ [ovݗ ;.F@/NC{=^cAXE[?1P>,l?>S%?٭Q?^ tL幝\?.k|<vnWb'j(b?>qSS.)ևlq=sޏ~\羼~>8SC;{ѽߣO}p5} z4~@Ri9f:]l?10O>'߰^]o0O!G3;9Je7#$fqۛyJ3^OgзgJ~x~!_0uO}w|v~EXkJsB?O)?k~cl/js^н1nCKv5|^wbV~Pso;jz9Q{%'ϣzsOW@ύX^@v^v"~.V`2?kL'ѣ(^tirϟP}yٮh? |Y-;zZqkmՖ{~J/BLr&iAsBQ~rWN~g{S[p=Go~@fϺUaZ߅7-zwzoV %_MiEZx/ocWK{o?n;OޒI-qu(N|Q/,%ޣ% qOX$A{,7|a\G/GC;aFW9mO|Fy#Nk~5V>g<hL'ϛBn/~~؞񡽷xV>NWzڸG~m|y\0@~/u^t V޴۰]+=yJ2k:M?]\~"|Z'BT/%QGtͿǙkԌ?=~hJk\7@i>`~siIb~"=8A=q}n$q`|ZX!?qݣ<¯Ιnz5(]nm܅v57G'zǣ'{_*E7쏕t}Džٟׄ[I i~_|/(,ʕW9Iz\ųV+Ϯ*wi~D?K1n;g?u/ʇՃQrdgq}ƛ\V<˕3^gj2_kz2>X/e9(3F1Xzy}">'üx~~9ʧOku$v>>wB޴j76R$FĵI\/qA%nE{$xP!%(cKRž%nh&@!OgŽbG=g?q?=]т 9.m ?Ͽz;|wjk~<~Ux A﫻xLەw2v!Oio4pJkr~֛?^Og];F;owoվǃ6_k뻨|7?k|~7?oꍛ5~Ma4|QrGZ91{փZ!]–=-IMs;-u]:^ͿPOP~^@~?\ \ylf! YBZ!{rߡG]ɤLG^s\&.Kc<|Oz)N{n_}W2߹xvv9ٞcdy^Yq+18zXhK`=ev:ʧK?k |{ѓjǩ=I {Irt??Y5t|O)Vk߅zjwWl vs {N*aƝ+/;#yt<=/׽֯} ~HÞ&nء7}3.u=f+Έ;G4GǸ#e{vJysR|T!ϰwj^?ke&j۩(uEX\9O8/y Kw﹂8_a=j ~dqrrvE{~14= Kka*-NIiWr]EvyvWaQaQv/۷Vfڐ٫dW|,s&.F)Xv~(wv qF/I/1S?ÞWm8`|g9G z\$qIG^;|a/_luLsJϏQk{wݤ3l?9sh9<ۿ(;<_kĵ'׽ 7`a+~O҃7v [Zz1`''Q><q^7=ywvޗק{ ־[diLSEUD\K^)|oEp щVzp=gz>.jz#,}'S:j~O\||>W v{O-Ľgt|?_bw-ޯ4ް,'׵?_{_rXqwcܔ\;g|`yRY4=IQ.~7R>r*wҢc,'O?MH{ t(v/? k^^ #Dsn 'e'8MsWZKӿx<|2QnRqy?S>mϏM"~>/#>xx~,GJG텵B肜<ߧE3ݫ<'x}4l~嚝~6?G?<Os{-=(+ .wy!_)1߳HQ.ׯE ?ߵ`ir_)nҟW5:jqĽ}pӬg΅6a@k>Xk zž[smA$F;΋쇉Ghh|^~y ?B{lCxyyyGK u6<jGU\eU> lqO3!!X~\s~'Q}.Hϻ(<'Qr*+yݞ[Z-O/>ƍm۶wرyc-7n8glm˶7u%r(6mn_(VWb[; N?+B͝]}m7-96Bήͧ,8> wLɛmFqiҹuÉ}[[s53c>͘F6Y،&5n~7 7(Ϳ~W%[ M NA.x|AM=,|߈0e ߌD8~Sea#>+mg<?0o^>،XHShl"UOw/6_ƧYq |Y`c ltz~kͺIywiX`Ǟnacc?fkB-|"+Fo`@ 9,щ5Y؃Yf9#щgZ!Y} 3.6ca@`36k-la,;-!g m?Yx6}7!ykR`O6G`]Xa6A-lq9†y\3"'6{#,leD`/SG,dZyXvz~7'#-ltΜF4d&i#孆) .+yA ltN,g~>o\`s7*ѵ3+fsq &̰؈ȐEL̓tml^,S5b[6Ul lt΄F俠s>sV6$ę菦)qyJ࿘væxUb>j+ߨ8Xϰ1Q&ރ-O \3-/SÃ~i<"ugzp핋U>˴Epm xe<72 |l\bQN.3 BCW[JkU&|E-K,llɢHbg6ט_^Ș,ڮ7|/ -~_C~Ydm0eaf~x%p,ڍ-ge{lfCŔSM}§|G =c5| >#p#/ZBCȏxp՗,|/ <L |-|,<(u6_bp}:n2mӿYF_nƔF­ pY-٘&SMiNS4uoo[x;jƲ]-wߵpxB`:#mF/µʴE; ?&_mN3f?~i-Z#?Z~/? :g,FMZF~~~)s NC2pQw݆og{l SG ~_Y^^g-~F?`x g ϴwiY{p0m&-)ӿڔg =oL>`z[G-_4gC{# < Ńid b|_51 Ȁja M_;-oxN7eά<ȆSu1f:SiYoKhp ##[x_Wn,/ ?,KG¿6xSйkw7:hdc? ?hW[&-gXx~>Ӵ]u wgZxnxOxlxp(=xBh ex%نX5y>Yk##ka?d_gᏚz5xK,qS2}nŸ6e3c_sȡ_02R Vq,%_622 S[bh[jE LiW"<&m7 73w3xʔm mS1<`6 O پ SVM_WlL :,KSgh2mb_[-#]p5,xδ%L{,'CxVMٛ-\?bKG ~Ȓ6Yxi#zjp(nk. |׽f8Su>;,L/#l@ ̇ ć ^d>Lćϟ$dωW!xtm$>b>|.l<3{/@ؘ/D1^ qŜ#S'sߺx-̜E:h\e]"ҖyW%*sü0"<&B#ei|)7ėޘ/G2_r#~KG#'/O!ߙ? {x3H+&>;]ϣ3i UH/ g| C"qdG:P?7 !qd zQgoA^2 aĿF>I|7#˜QV_3? ?4xQ4c*g~~>xI?w_P\e/ţ@4S/*e~yEg/*e~a~MqCH f~6̼pn$~_Cy|x#y n+27 clul+ xX ro7!vw]u/ewr" ̇@Y%0]+ǻGYpg%т{<|QV͊癏L͉O'!'#m-WwS-Otgnފ}Hfag~ !>SYj قHO'?8"a;lX⧐wOƘA:3?ߏ#~yt<~g~6y `'/"'$eh95h4dވ= ?RğIpw7񦂇 a^^ERs)ě n9xs=o!xyKgo00ow{e%ΰo+L9x{|ySi2oVͼI]32.xo\enx1)8}.;;^Я!~aaFA|'d_@n>@3U0p^H||17W?G#O(|4#?Ÿ $IO>q*3̧~SOG3vqLk»̫acY]swE'x|scM/D8c8S8|gq Ӱ lB|9(eO2/뉋3 đy=ғyҁBo5o7|K:TS!B=a9'L9LU&Q=ɳ\X,e'6/H9My 0SoFv[b,VlU1VغrB=)'2B % SQ%Bs:V'B)"=[.Rai*LD J\o\*J3%X؇LLT0S0E; Sa:#Wڞ:91)SɄVoZhmvKFhZ#+zczKVka똩ŬA2gE.I%l-.HWXzS0he\^cj 2KR.uKѰ% ӓ/gX=EP(e%3G<4U+Ӫq1], Ͷ,> [F6%灸@'9ǥǥ=@NIm_MZٛ\jy)K[ Us\ :cBuq _Fd4h>^auF >&0&snOonNNWj62=3.'w4E?1-?/3L4M(GO7Y.պ+knuxe"Ϛq/f*CjRtPu_")֐D|nC(LEOR=a24sGe}ߨLqKPCWsSRӜi8pֲa'~vW_y}>rrt 5٪ߛw6z~W֨ff|T43hqx*b.?'Z_!gxE JqCn/NTk{9e7K˲%4Ѹtؽb-/FG>]avE)RjL;["χ= p?*&&/Is#1V9A!I7=#&7#$lO?n)a:|y.-a>?4l,(#=R\Sw(DEk[kEM4x&Zԡޔ1$M6rxYZOdleM;D ~C#r]M)]l hzCv%Q}iKjb*IPU\mŬ|ut5jhcθU6Gt @ͫv[A*{y\ْ:ϲ7FT {si)ԍٳ~ZYH0v)(z,q"YbKd?+K\>ΒQ1ĥQY2(|;G\'ͯ2GZI)wWB], :q>8m &հ5@b EiB](t΅?+" 4Q "ŒSڣm4BPIwgF+=/V7iLRVǛNn Sr%.>EL&s+Kh]EIRSES.6p]D NeLIuA9mAiFۭ$mOjkg,t'Kk+,{\725 K\3Hu!~D56 jsZ/ ^kj\ҙ470u:9X<)7Ԗ *.tYluJ!^R֮#/&J.[.L<+:P!uD6iM$QGʱiuuy2YP<Omqn)dzQ :έ:etf k-:jn5hdZ5ТvQ \ j[kCmfrmk{+n9le=sJh*ө7f"ޞۮcl!`%J/@*z#Kxu ]+~)/Q%%ycoB UɛxAoM%T%D|S2o ׁbhRnfUWn.}Q͵e7%.q"urP.q]S`ȪD6GV4G 'RmKsQAX:kͅofY"N'O6)ecwL*-|?"~e~$|qOxv̠֣{ Lx;lQeKzo H%Z_'|>׎a"V^vI DټX[{zǗWqt>Yo7jQV- մ@t<H40 amxmodx\plugins\df_hook.amxxXXMA &?Pl)q x[Ml~()(YNMAlNFMiIGiV-MqWc(JE](\rA5tP 4u|!0P5|pDr]Z`{o#H$D"TPKu sl :*eHmD.ϵY . %? ^?}?yw]T0O !3 &_o R`4İO>#%o 8+  . |DxF 3]pRSNPKv2Se'_ɻRB֡=]pFA?}B'E&Рנ^>{lȳiGs<}j"/8buyvGO2=Z /7yLi}Dl_MEz‡{Sd83=ĺ=ay(,:5Nqԫv~CtL4{^{erB\semZMռCr׿O=_h>o>j|u\/o>ǺKL"|duisXN6xquӱ!/}t_'3jl{oȮ ykӢW[{2b_O[=_h‚u\,Uc.7zpJΉ bsҶn8Gd$y93(͙'3ϚDz (5V/Fk~=s?xDy?c=zIau9ch۬~Q{<͉ [3oT=t5kLt]ldެSnĪ3kg7ma%#Izq^+/r"1jAoLb. :htxБմ=>Z}Og1;Ŏ?#wP&;>#URkAt9:DqtBI[{t?2"6V '%nY&wUg#]7YP/Z9u?L<>y6dJsZG=vt-7&EZcF-QI7ѿ?D+Guwc[S#V13 Nyd"t~fГFLnʲqϖ3Խ{x=k,bӇحR%ClF|Qr1;sxF9Hu/oqXK|jQpgx軈0G9&>vDM<j?l`B6ʼn)dǛyoo5βxCDxzo'[ f p'\w0pGO]lz#+O<<~>wVZO66ӄ@@_UnQӑ(( rþ ~dcckgkg͵d캂{`vf:xt*MYngӏ}'^Qqw8q~,' Kq F8DⶋlRJCawCn ws\  +===D}จr\`XOl/B/g{܍^yLg>`8#.q]><]8  n6A 2y3{g?3B?X( nUͧP(KUod;'kPY#kGo8U,Q!&1$94Aǫ.r2]N3\v+8ҟXSQi;'1UcVZ3 ͻR^n4QQ4wFV|@BKzFQ계񊫀k\6E* WA5$LaE&c=\c~AsQ{ " p:.5kM被ԧjZ *R _Yk*eWuq~ TT~ bO_)Tʬ(u[Rs\eP^RfY_^ΜA!*zQDƪih|+~o uѓ;Wb c 0K(ŏ*oXkLj;^/\|du3܇7 .nt| P&qve$ 3;~߄å2h5s]UqnYcU;>]^ u9UTJmgh)~b/Z6&zZS9ZOJYΗ/TH^Q9jS5ϖIvkڹv^sx]MpW~xXG 8$9@8%$$&QZkGhWB|*qBTQO9Tqpt N8@RAmwv_UI=ӯ_~̼aD6+]GL6W̗F |6CWf&RDZW) #R&_W͸7YT#f#^53K #dr^.?z )*傗ϗDR6Ɏ ի熊93/2cERT˙D1^=]'_ې:_WVVi#9h&ddv<㷔/.#Jկ"U.늸 J>g'JB9[ǔ=lF%n?&Lj_ÄyS 0ձ5Ngw8J+i_Ò~cFP >L#ilzA~a:m=i5v`;߻Ϯ~%森tַˮo$r$gzo߳=qvk%8 ۵+],înM:?#>|B>!^ 壾Q;AO(\:GzR}v=/hl7`$B 1NO)ݵa?Bohr牟iL0.C\t[~[k~5n+Ds\Ov;ԭ~̇u˥g7)a}vA_Vz.\]}x/@^|z< Br+[WdVr~- 8e [X8@>ơyh&+-{iȷ1gڡz.\oA?chPaZ7W<zV: q9@$ݎkϳG6wG֏۪|twΩcs8A4XCc| 4;oM~'癭v;y\OQ?m7b<{Pa?D?[]lxYuU08fjq}\Ǯo_SWBKIE:Z%aoT"F^{ <2Ag!"qG7K4/DE^9'ۯ\. yxB; V%}1@T> 3n{:vx$8}Xrj~'x ?q{r{v@hgvuljީBFǍWzq{{!(;5 h5>~ |Y:Zco8d{Z{oa6>\E:(k=v*~W7q\x.?|47?';izs{%'G _ lu;fyV!s\v?G`b|!V[kخJf_W|n٫ofO{u~p~'zuǑ&yZ}=k|~.^cA"!;*mΘ;agCET-drlqjS'KC't1_:z g'*l+Fv';.(ӊe/ KLllWy|R6\Q\6K K6Y c)8&jδ\i&pJwn/;.+.(*o~DoJtIVj)[ J_ŒҤnےl _qZqy[%xJz&۬i/ Q5&_US\(. eV׻j׊r;[n-+.Wk*iť9E\]."ҊKt;M|GqjaެⲁfNqٜҫDI?Q\tGuT\|2'kv2%uwr']0KDL+.+AU#W?!tN|_'>s\7xK2.).޴Fa̋Qe^(.bEq!w#5eG2Gf̅.2/ҺHŲ2/ҺHEMqSQŒ3.s2G6̅MA.ż2/zu{dUU; {NqYkJ٣ˤ$\hIqY9xcl}ηEU8vJVdJˊDZ/QMpy]SiJNY  ݮSVO|~a?Oi0Ұ,`qh]j6a3ȱl%*>zIi5|)ǐdS7V,uow/_<}UC6{9;lX|lx 3|I>لdWg=MxZe3$90n$ iZK’Gm+C$!P-(bޱlEj : Enables|Disables all climb.amx functionality. * climb_boost <1|0> : Enables|Disables boosting. * climb_cpprice <0|...> : Set to dollar amount for cost of checkpoints. * climb_startmoney <1337|0-16000> : Money amount set when players start timer. * * climb_render <0|1> : Changes unsolid rendering style, 0=classic, other=new more see through rendering. * climb_sounds <1|0> : Enables|Disables sounds build in to the Climb plugin. * * climb_webmod <0|1> : Disables|Enables web mod interoperability. * climb_stats_path : Path to save generated stats pages. (If using * WebMod, enter path to webmods www folder.) * climb_stats_url : URL to send clients to for stats pages. Only * use if you have a web server running on the * same machine as the game server. * IF WEBMOD=1 THIS IS IGNORED. * climb_stats_hsurl : "%s" will be replaced with map name. Set * to send client to URL if you have a page * that automatically generates high scores via * direct DB access. * IF WEBMOD=1 THIS IS IGNORED. * climb_stats_msg : Message to display on scoreboard. Use HTML * * ip_internal : Set to internal network IP or hostname. (If server behind NAT) * ip_external : Set to external network IP or hostname. * * climb_msg_r <0|0-255> : Display message red value. * climb_msg_g <150|0-255> : Display message green value. * climb_msg_b <250|0-255> : Display message blue value. * climb_msg_x <0.05|0-1> : Display message x position. * climb_msg_y <0.5|0-1> : Display message y position. * * *The following cvars are only read at plugin load, changes will not take * effect until the map is changed. * climb_save <1|0> : Enables|Disables saving of stats to a database. * * climb_db_type : Database type. * climb_db_host <127.0.0.1> : Database host name/ip. * climb_db_user : Database user name. * climb_db_pass : Database password. * climb_db_name : Database name. * climb_db_prefix : Table name prefix. *=============================================================================== * Requirements: * Modules: * Engine * Fakemeta * DB Module (MySQL or SQLite/Only need to use stats.) * AMXX 1.76 or higher *=============================================================================== * Notes: * Enjoy! *=============================================================================== * Change Log: * Key (+ added | - removed | c changed | f fixed | r refactored) * * v2.0a2 (FEB 16, 2007) * +: 2 addition boost types. Super jump and double jump. (No partner needed for boosting anymore) * +: Boosts are counted. (Not logged in DB yet.) * +: Stats saving in database. MySQL or SQLite. (MySQL not tested yet. Only works with single db module enabled) * +: Players now get rewarded for finishing even without starting the timer. * +: Cvars for message color and position. (climb_msg_r, ..._g, ..._b, ..._x, ..._y) * +: Cvar climb_startmoney - Value to set money to when players start timer. * +: Cvar climb_stats_msg - Message to display on the HTML scoreboards. * +: Cvar climb_unsolid_type - Change rendering style for unsolid players. * +: Cvar climb_sounds - Disabled Climb plugin sounds. * +: Several cvars for database settings. * +: All players spawn at spawn point closest to the start button. (Eliminates cheat in maps with a spawn point at the finish button.) * +: Additional spawns added during map load to fix maps without enough spawns. * +: Timeouts for respawning and boosting. * +: Command "help". Displays HTML help pages. * -: AMX compatability. (AMX is officially dead) * c: Cvars now prefixed with climb_ instead of amx_. * c: Minor code optimizations. * c: Command "Boost" now takes players to the boost help page instead of activating solid boost. * r: All internal cvar handling is now done with pointers. (With the acception of cvars used only during init functions.) * r: Solid boost only lasts 15 seconds at a time now since its usage is being tracked. * r: Major internal rewrite (Probably added a few bugs. More major rewrites coming in next release.) * v1.9.19 (AUG 02, 2006) * +: New public cvar 'climb_version' to aid in searching for server with this plugin. * +: Show checkpoints, gochecks, and finish stats (Stats will be more extensive in next version) with finish announcement. * -: Global chat. Use AllChat plugin instead. * -: Cvar: amx_climb_globchat * c: The /spec command now obeys the cvar "allow_spectators", clients with reserved slot always allowed. * c: Shows number of checks and gocheck on client finish announcement. * f: Bug caused by using stop command while paused. * r: Client commands reworked. Everything functions the same, but with more functionality. For example the gc command can be entered as any of the following: gc, /gc, \gc, say gc, say /gc, say \gc, say_team gc, etc... * v1.9.18 (MAY 15, 2006) * r: Recoded the way health is handled. Should work for any map now. * v1.9.17 (APR 07, 2006) * c: Plugin is now compatible with both AMX and AMXX. * c: The /spectate command can now be used by anyone. Admin no longer required. * v1.9.16a * f: Added health fix for kz_cfl_yamakasi. * c: New CSS theme for html scoreboard. * v1.9.16 * +: Counts usage of CP and GC commands(only displayed on html scoreboard). * f: Added health fix for kz_lighthouse and kz_phoogi. * v1.9.15 * +: Colorized global chat. ADMIN_RESERVATION has name in green instead of team color. * +: /stop command. Resets timer to zero, end climbing session. * c: Reset function. /stop + /respawn. Client is now reset automatically when pressing the start button if they are not already started. * f: YOU CAN'T GET STUCK ANYMORE!!! (Well almost. Doing gocheck a second time gets you unstuck.) * f: Global chat is now logged correctly and shows up in HLSW. * v1.9.14 * +: Hook is taken away when client starts timer, given back if they reset. * +: Max health fixes for several new maps. * +: Sort clients on CS scoreboard by climb rank. * +: Cvar amx_climb_boost - enable\disable boosting. * +: Cvar amx_climb_cpprice - charge money for checkpoints. * +: Custom configurable commands based on events. (climb.ini) * +: Global chat. cvar: amx_climb_globchat <1|0> * +: Client climb time is now shown using the round time HUD sprites. * -: Command /mytime, not needed because of HUD sprite timer. * -: Auto time display every 30 seconds, not needed because of HUD sprite timer. * c: Added another start button sound. * c: Super healing doors no longer removed. (Needed for shortcuts in some maps.) * f: Admins can't be alive as spectator even with 3rd party respawn plugin. * f: Keep godmode after respawning if finished map and not reset. * f: Admins VIP display on CS scoreboard is now updated whenever clients connect. * f: Health charger minimaps in kz_real_skyscraper & kz_northpole_b01. * f: Not teleporting to exact cp position if another client is on your cp. * f: Respawning outside of maps sometimes immediately after leaving spectator. */ #include #include #include #include #include #include #include #include #include #define SF_MAX 50 //Maximum number of start/finish commands in climb.ini #define VERSION "2.0a2" //DB variables new Handle:db_tuple,db_prefix[10],bool:climb_save //Client flags arrays new Float:origins[32][41],timer[32][13],time_stamps[33][2],Float:post_think_vel[32][3] //Temp save vars new steamid[32][32],savepos=0,Float:originssave[32][41],timersave[32][13] //Touch for unsolid clients new trig[100],trignum=0,brk[50],brknum=0 //Other stuff new hooked[32],hp=100 new sfactions[SF_MAX][50],sfcount=0 new score_ts,hscore_ts new dyn_spawn_ids[32],dyn_spawn_count=-1,Float:spawn_tp_orig[3] //Cvar Pointers new p_climb,p_webmod,p_boost,p_cpprice new p_msg_r,p_msg_g,p_msg_b,p_msg_x,p_msg_y new p_sounds,p_render new p_ip_internal,p_ip_external,p_port new p_allow_spectators,p_startmoney new p_stats_path,p_stats_url,p_stats_hsurl,p_stats_msg //Model size //standing 32x32x72 //crouched 32x32x36 //timestamps[id][x] #define TS_SPAWN 0 #define TS_BOOST 1 //Tasks: //#define TSK_AUTOHEAL 50 //50+ : Auto Heal //#define TSK_AUTORSPN 100 //100+: Auto Respawn //#define TSK_BOOSTTMR 150 //150+: Solid Boost Timer //timer[id][x]: #define TMR_CFLAGS 0 //Status #define TMR_STARTD 1 //Start Time #define TMR_FINISH 2 //Finish Time #define TMR_CPSCNT 3 //CP Count #define TMR_GCSCNT 4 //GC Count #define TMR_BSTTME 5 //Best Time #define TMR_BSTCPS 6 //Best CP #define TMR_BSTGCS 7 //Best GC #define TMR_SESFIN 8 //Finished this session #define TMR_MAPFIN 9 //Total times finished this map #define TMR_DBUSER 10 //Database player ID; 0=not registered; -1=not registered & shared steam id #define TMR_BOOSTS 11 //Number of boosts used #define TMR_WPNUSE 12 //Bit sum of used weapons //Status timer[id][TMR_CFLAGS]&=x #define CF_NULL 0 //Used to clear flags in change_status() and change_boost() functions #define CF_STOP (1<<0) //STATUS FLAG: Not Started #define CF_START (1<<1) //STATUS FLAG: Climbing #define CF_PAUSE (1<<2) //STATUS FLAG: Paused #define CF_SOLID (1<<3) //BOOST FLAG #define CF_SUPER_JUMP (1<<4) //BOOST FLAG #define CF_DOUBLE_JUMP (1<<5) //BOOST FLAG #define CF_SPAWN_NO_GC (1<<6) #define CF_NO_SCOUT (1<<7) #define CF_NO_VIP (1<<8) public client_putinserver(id){ if(get_pcvar_num(p_climb)&&!is_user_bot(id)){ new ida[1] ida[0]=id set_task(20.0,"connect_advert",0,ida,1) //Set CF_STOP status change_status(id,CF_STOP) //search steamid to position reference for match new searchid[32] get_user_authid(id,searchid,31) for(new i=0;i<32;i++) if(equal(searchid,steamid[i])){ //load origins & timer array if match found origins[id]=originssave[i] timer[id]=timersave[i] return PLUGIN_CONTINUE } if(climb_save&&timer[id][TMR_DBUSER]<1) set_task(5.0,"auto_login",0,ida,1) } return PLUGIN_CONTINUE } public connect_advert(ida[1]){ new id=ida[0] new msg[51] formatex(msg,50,"^x04 ^t^t^t^t^t^t^tThis server is using Climb v%s by:",VERSION) saytext(id,id,msg) saytext(id,id,"^x04 ^t^t^t^t^t^t^tIan (Juan) Cammarata (http://ian.cammarata.us)") } public auto_login(ida[1]) return client_cmd(ida[0],"login") public client_disconnect(id){ if(get_pcvar_num(p_climb)&&!is_user_bot(id)){ savepos++ if(savepos==31)savepos=0 new saveid[32] get_user_authid(id,saveid,32) //erase previous save if exists for(new i=0;i<32;i++)if(equal(saveid,steamid[i]))steamid[i]="" //save steamid to position reference steamid[savepos]=saveid //save origins originssave[savepos]=origins[id] //save timer array/Pause if running if(timer[id][TMR_CFLAGS]&CF_START)change_status(id,CF_PAUSE) timersave[savepos]=timer[id] //clear origins for new client in that slot for(new i=0;i<8;i++)origins[id][i]=0.0 for(new i=0;i<11;i++)timer[id][i]=0 hooked[id]=0 } return PLUGIN_HANDLED } public check(id){ if(get_pcvar_num(p_climb)&&isalive(id)&¬paused(id)){ new cpprice=get_pcvar_num(p_cpprice) if(cpprice>0){ new cash=cs_get_user_money(id) if(cpprice>cash){ clmsg(id,"You don't have enough cash for more checkpoints.") client_print(id,print_chat,"You don't have enough cash for more checkpoints.") return PLUGIN_HANDLED } cs_set_user_money(id,cash-cpprice) } if(!hooked[id]){ new Float:vel[3] entity_get_vector(id,EV_VEC_velocity,vel) if(vel[2]>=0){ new Float:coords[3] entity_get_vector(id,EV_VEC_origin,coords) if(coords[0]||coords[1]||coords[2]){ for(new i=39;i>3;i--) origins[id][i]=origins[id][i-4] for(new i=0;i<3;i++) origins[id][i]=coords[i] origins[id][3]=entity_get_float(id, EV_FL_gravity) new msg[100]="Checkpoint saved." if(timer[id][TMR_CFLAGS]&CF_START){ timer[id][TMR_CPSCNT]++ formatex(msg,99,"Checkpoint saved. (%d CPS/ %d GCS/ %d Boosts)",timer[id][TMR_CPSCNT],timer[id][TMR_GCSCNT],timer[id][TMR_BOOSTS]) } clmsg(id,msg) } else clmsg(id,"Can not save checkpoint at current location.") } else clmsg(id,"You can't make checkpoints while falling.") } else clmsg(id,"You can't make checkpoints while using hook.") } return PLUGIN_HANDLED } public gocheck(id){ if(get_pcvar_num(p_climb)&&isalive(id)&¬paused(id)){ if(origins[id][0]||origins[id][1]||origins[id][2]){ new Float:coords[3] for(new i=0;i<3;i++)coords[i]=origins[id][i] entity_set_float(id,EV_FL_gravity,origins[id][3]) teleport(id,coords) new msg[100]="Checkpoint restored." if(timer[id][TMR_CFLAGS]&CF_START){ timer[id][TMR_GCSCNT]++ formatex(msg,99,"Checkpoint restored. (%d CPS/ %d GCS/ %d Boosts)",timer[id][TMR_CPSCNT],timer[id][TMR_GCSCNT],timer[id][TMR_BOOSTS]) } clmsg(id,msg) } else{ clmsg(id,"You must make a checkpoint first.") return 0 } } return 1 } public stuck(id){ if(get_pcvar_num(p_climb)&&isalive(id)&¬paused(id)){ if(origins[id][4]||origins[id][5]||origins[id][6]){ new Float:coords[3] for(new i=0;i<36;i++) origins[id][i]=origins[id][i+4] for(new i=0;i<3;i++) coords[i]=origins[id][i] entity_set_float(id,EV_FL_gravity,origins[id][3]) teleport(id,coords) new msg[100]="Previous checkpoint restored." if(timer[id][TMR_CFLAGS]&CF_START){ timer[id][TMR_CPSCNT]-- formatex(msg,99,"Previous checkpoint restored. (%d CPS/ %d GCS/ %d Boosts)",timer[id][TMR_CPSCNT],timer[id][TMR_GCSCNT],timer[id][TMR_BOOSTS]) } clmsg(id,msg) new cpprice=get_pcvar_num(p_cpprice) if(cpprice>0){ new cash=cs_get_user_money(id) cs_set_user_money(id,cash+cpprice) } } else clmsg(id,"You have no previous checkpoints remaining.") } return PLUGIN_HANDLED } //Respawn client when they die public death_msg(){ if (get_pcvar_num(p_climb)){ new id=read_data(2) new ida[1] ida[0]=id if(task_exists(100+id))remove_task(100+id) if(isct(id)){ set_task(0.2,"respawn",100+id,ida,1) } } return PLUGIN_HANDLED } public change_status(id,newstat){ new cflags=timer[id][TMR_CFLAGS] if(cflags&CF_STOP)timer[id][TMR_CFLAGS]-=CF_STOP else if(cflags&CF_START)timer[id][TMR_CFLAGS]-=CF_START else if(cflags&CF_PAUSE)timer[id][TMR_CFLAGS]-=CF_PAUSE if(newstat&CF_PAUSE){ if(cflags&CF_PAUSE){ timer[id][TMR_CFLAGS]+=CF_START timer[id][TMR_STARTD]=get_systime()-timer[id][TMR_STARTD] set_entity_flags(id,FL_FROZEN,0) unsolid(id) entity_set_float(id,EV_FL_gravity,origins[id][40]) clmsg(id,"UNPAUSED") } else if(cflags&CF_START){ cl_pause(id) timer[id][TMR_CFLAGS]+=CF_PAUSE } else{ clmsg(id,"You must start the timer before you can pause.") timer[id][TMR_CFLAGS]=cflags } } else timer[id][TMR_CFLAGS]+=newstat return PLUGIN_HANDLED } public cl_pause(id){ timer[id][TMR_STARTD]=get_systime()-timer[id][TMR_STARTD] set_entity_flags(id,FL_FROZEN,1) unsolid(id) set_rendering(id,kRenderFxGlowShell,0,0,255,kRenderTransColor,1) origins[id][40]=entity_get_float(id,EV_FL_gravity) entity_set_float(id,EV_FL_gravity,0.0) clmsg(id,"PAUSED") return PLUGIN_HANDLED } public stop(id){ if(get_pcvar_num(p_climb)&&timer[id][TMR_CFLAGS]&CF_START/*&¬paused(id)*/){ change_status(id,CF_STOP) sfexec(id,4) //Execute commands from start/finish config } return PLUGIN_HANDLED } public reset(id){ if(get_pcvar_num(p_climb)&&check_timeout(id,get_systime(),time_stamps[id][TS_SPAWN],5)){ stop(id) frespawn(id) } return PLUGIN_HANDLED } public frespawn(id){ if(get_pcvar_num(p_climb)&&check_timeout(id,get_systime(),time_stamps[id][TS_SPAWN],5)){ if(get_user_team(id)==3)cs_set_user_team(id,2) timer[id][TMR_CFLAGS]+=CF_SPAWN_NO_GC cs_user_spawn(id) } return PLUGIN_HANDLED } public respawn(ida[]){ new id=ida[0] if(!get_user_team(id)||is_user_alive(id)||!isct(id)) return PLUGIN_HANDLED cs_user_spawn(id) //gocheck(id) return PLUGIN_HANDLED } public spawned(id){ if(get_pcvar_num(p_climb)){ //Block Buying new cflags=timer[id][TMR_CFLAGS] set_msg_block(get_user_msgid("StatusIcon"),2) if(is_user_alive(id)){ //Set them to CT if they're a spectator if(get_user_team(id)==3)cs_set_user_team(id,2) sortcssb() //If they are paused freeze them again. if(cflags&CF_PAUSE)cl_pause(id) set_user_health(id,hp) //Only admins can shoot other clients. //if(!(get_user_flags(id)&ADMIN_SLAY))set_user_hitzones(id,0,0) //Keeps players from seeing eachothers names. //Remove stuff dropped on death remove_entity_name("weaponbox") remove_entity_name("item_thighpack") //Execute commands from start/finish config sfexec(id,1) //Show admin as VIP on Scoreboard. if(get_user_flags(id)&ADMIN_SLAY)cs_set_user_scoreattrib(id,4) //Equip Task new ida[1] ida[0]=id set_task(0.1,"equip",_,ida,1) time_stamps[id][TS_SPAWN]=get_systime() //Teleport to safe place/old primary spawn position if(cflags&CF_SPAWN_NO_GC){ if(vector_distance(spawn_tp_orig,Float:{0,0,0}))teleport(id,spawn_tp_orig) timer[id][TMR_CFLAGS]-=CF_SPAWN_NO_GC } else if(!gocheck(id))if(!(cflags&CF_START&&!getusertime(id)))if(vector_distance(spawn_tp_orig,Float:{0,0,0}))teleport(id,spawn_tp_orig) } } else set_msg_block(get_user_msgid("StatusIcon"),0) return PLUGIN_CONTINUE } public equip(ida[]){ //Give equipment to client, delayed to prevent crash new id=ida[0] for(new i=0;i<2;i++)give_item(id,"weapon_scout") give_item(id,"weapon_c4") cs_set_user_nvg(id) } public check_timeout(id,time1,time2,freq){ if(time10)clmsg(id,msg) return 0 } return 1 } public change_boost(id,newboost){ //Change Boost flags if(!(cvar_enabled(id,p_boost)&&isalive(id))&¬paused(id))return PLUGIN_HANDLED new msg[151],rmflag,cflags=timer[id][TMR_CFLAGS] if(cflags&CF_SOLID){ if(task_exists(150+id))remove_task(150+id) rmflag=CF_SOLID msg="Solid Boost Disabled.^n" } else if(cflags&CF_SUPER_JUMP){ rmflag=CF_SUPER_JUMP msg="Super Jump Disabled.^n" } else if(cflags&CF_DOUBLE_JUMP){ rmflag=CF_DOUBLE_JUMP msg="Double Jump Disabled.^n" } if(rmflag>0)timer[id][TMR_CFLAGS]-=rmflag if(!(rmflag&newboost)&&check_timeout(id,(cflags&CF_START?getusertime(id):get_systime()),time_stamps[id][TS_BOOST],5)){ if(newboost==CF_SOLID){ format(msg,150,"%sSolid Boost Enabled.",msg) new ida[1] ida[0]=id set_task(15.0,"solid_boost_timer",150+id,ida,1) if(timer[id][TMR_CFLAGS]&CF_START)timer[id][TMR_BOOSTS]++ } if(newboost==CF_SUPER_JUMP)format(msg,150,"%sSuper Jump Enabled.",msg) if(newboost==CF_DOUBLE_JUMP)format(msg,150,"%sDouble Jump Enabled.",msg) timer[id][TMR_CFLAGS]+=newboost } if(strlen(msg))clmsg(id,msg) return PLUGIN_HANDLED } public solid_boost_timer(ida[]){ //Task to auto disable solid boost after timeout //if(timer[id][TMR_CFLAGS]&CF_SOLID)solid_boost(id) //Shouldn't need the if statement change_boost(ida[0],CF_SOLID) return PLUGIN_HANDLED } //Semi-clip, and entity touch detection for non-solid clients //* Maybe move this to client prethink public server_frame(){ if(get_pcvar_num(p_climb)){ new players[32],num,i,j,Float:c1[3],Float:c2[3] new Float:c1z[3],Float:c2z[3] new id_i,id_j,cflags_i,cflags_j get_players(players,num,"ac") if(trignum){ for(i=0;i=c1[0]&&c2[1]<=c1[1]&&c2z[1]>=c1[1]&&c2[2]<=c1[2]&&c2z[2]>=c1[2]){ fake_touch(id_j,id_i) j=trignum } } } } } if(brknum){ for(i=0;i25&&vector_distance(c1z,c2z)>30)){ unsolid(id_i) unsolid(id_j) j=num } } } if(j+1==num)solid(id_i) } } } } return PLUGIN_CONTINUE } public client_PreThink(id){ if(!(get_pcvar_num(p_climb)&&get_pcvar_num(p_boost)&&isalive(id)))return PLUGIN_CONTINUE new cflags=timer[id][TMR_CFLAGS],bool:onground=false if(get_entity_flags(id)&FL_ONGROUND)onground=true if(get_user_button(id)&IN_JUMP){ if(cflags&CF_SUPER_JUMP&&onground){ entity_get_vector(id,EV_VEC_velocity,post_think_vel[id]) if(post_think_vel[id][0]!=0.0||post_think_vel[id][1]!=0.0){ velocity_by_aim(id,600,post_think_vel[id]) if(post_think_vel[id][2]<250.0)post_think_vel[id][2]=250.0 if(post_think_vel[id][2]>350.0)post_think_vel[id][2]=350.0 } else post_think_vel[id]=Float:{0.0,0.0,0.0} } else if(cflags&CF_DOUBLE_JUMP){ if(!onground&&!(get_user_oldbutton(id)&IN_JUMP)){ entity_get_vector(id,EV_VEC_velocity,post_think_vel[id]) if(is_finished(id)||post_think_vel[id][2]>-500)post_think_vel[id][2]=250.0 else post_think_vel[id]=Float:{0.0,0.0,0.0} } } } return PLUGIN_CONTINUE } public client_PostThink(id){ if(!(get_pcvar_num(p_climb)&&get_pcvar_num(p_boost)&&isalive(id)))return PLUGIN_CONTINUE if(_:get_distance(_:post_think_vel[id],{0,0,0})){ entity_set_vector(id,EV_VEC_velocity,post_think_vel[id]) post_think_vel[id]=Float:{0.0,0.0,0.0} if(timer[id][TMR_CFLAGS]&CF_START){ timer[id][TMR_BOOSTS]++ //Increment client boost count time_stamps[id][TS_BOOST]=getusertime(id) //Timeout based on timer so they can't pause to avoid timeout change_boost(id,CF_NULL) } else if(!is_finished(id)){ time_stamps[id][TS_BOOST]=get_systime() change_boost(id,CF_NULL) } } return PLUGIN_CONTINUE } public is_finished(id){ new cflags=timer[id][TMR_CFLAGS] if(cflags&CF_STOP&&(get_user_flags(id)&ADMIN_RESERVATION||timer[id][TMR_SESFIN]>0)) return 1 return 0 } public traceline(Float:v1[3], Float:v2[3], noMonsters, entity){ if(get_pcvar_num(p_climb)){ new id=entity new entity2=get_tr(TR_pHit) if(id>0&&entity2>0){ if(is_user_alive(id)){ new class[32] entity_get_string(entity2,EV_SZ_classname,class,32) new Float:orig1[3],Float:orig2[3] entity_get_vector(id,EV_VEC_origin,orig1) get_brush_entity_origin(entity2,orig2) //if(get_user_button(id)&IN_USE&&get_user_aiming(id,a,b)<70&&equal(class,"func_button")){ if(get_user_button(id)&IN_USE&&vector_distance(orig1,orig2)<95&&equal(class,"func_button")){ new targ[32] entity_get_string(entity2,EV_SZ_target,targ,32) //Timer Start //if((!(timer[id][TMR_CFLAGS]&CF_START)||getusertime(id)>4)&&/*(timer[id][TMR_CFLAGS]&CF_STOP||timer[id][TMR_CFLAGS]==TMR_CFLAGS_FNSH)&&(*/equal(targ,"counter_start")||equal(targ,"clockstartbutton")||equal(targ,"firsttimerelay")/*)*/){ if((!(timer[id][TMR_CFLAGS]&CF_START)||check_timeout(id,get_systime(),time_stamps[id][TS_SPAWN],5))&&(equal(targ,"counter_start")||equal(targ,"clockstartbutton")||equal(targ,"firsttimerelay"))){ new Float:orig[3],Float:view[3] //Erase checkpoints for(new i=0;i<8;i++)origins[id][i]=0.0 //Set all associated variables timer[id][TMR_STARTD]=get_systime() change_status(id,CF_START) timer[id][TMR_CPSCNT]=0 timer[id][TMR_GCSCNT]=0 timer[id][TMR_BOOSTS]=0 //Respawn client to clear items. entity_get_vector(id,EV_VEC_origin,orig) entity_get_vector(id,EV_VEC_angles,view) cs_user_spawn(id) entity_set_vector(id,EV_VEC_origin,orig) entity_set_vector(id,EV_VEC_angles,view) delay_duck(id) cs_set_user_money(id,get_pcvar_num(p_startmoney)) //Play random start sound and text messages if(get_pcvar_num(p_sounds))switch(random_num(0,2)){ case 0:client_cmd(id,"spk barney/beertopside") case 1:client_cmd(id,"spk scientist/c3a2_sci_portopen") case 2:client_cmd(id,"spk barney/c1a2_ba_climb") } //Disable Boosts change_boost(id,CF_NULL) time_stamps[id][TS_BOOST]=0 clmsg(id,"Timer started. Go Go Go!!!") client_print(id,print_chat,"Timer started. Go Go Go!!!") //Update frags to reorder scoreboard sortcssb() //If stats save enabled warn unregistered clients to register if(climb_save)regwarn(id) //Execute commands from start/finish config sfexec(id,2) time_stamps[id][TS_SPAWN]=get_systime() } //Timer Stop else if(equal(targ,"counter_off")||equal(targ,"clockstopbutton")||equal(targ,"clockstop")){ if(timer[id][TMR_CFLAGS]&CF_START){ //Set client variables timer[id][TMR_FINISH]=get_systime() change_status(id,CF_STOP) timer[id][TMR_SESFIN]++ timer[id][TMR_MAPFIN]++ //Update frags to reorder scoreboard sortcssb() //Announce to client if(get_pcvar_num(p_sounds))client_cmd(0,"spk woop") clmsg(id,"Congratulations 1337 climber.") client_print(id,print_chat,"Congratulations 1337 climber.") new name[32],msg[21] formatex(msg,sizeof(msg)-1,"%s^t%s",getuserstatus(id),parsetime(getusertime(id))) //clmsg(id,msg) //client_print(id,print_chat,msg) //Announce to all get_user_name(id,name,32) client_print(0,print_chat,"%s^t%s^t(%d CPS/ %d GCS/ %d Boosts)^tCompleted (%d, %d)",name,msg,timer[id][TMR_CPSCNT],timer[id][TMR_GCSCNT],timer[id][TMR_BOOSTS],timer[id][TMR_SESFIN],timer[id][TMR_MAPFIN]) //If new record if(getusertime(id)0))clstat="fn" for(new i=0;i0){ tmp=players[i] while(j>0&&(timer[players[j-1]][TMR_BSTTME]==0?18000:timer[players[j-1]][TMR_BSTTME])>timer[tmp][TMR_BSTTME]){ players[j]=players[j-1] j-- } players[j]=tmp } } //2nd Insertion Sort clients by climbing time for(new i=1;i0){ tmp=players[i] while(j>0&&(getusertime(players[j-1])==0?18000:getusertime(players[j-1]))>getusertime(tmp)&&timer[players[j-1]][TMR_BSTTME]==timer[tmp][TMR_BSTTME]){ players[j]=players[j-1] j-- } players[j]=tmp } } return 1 } //Make pathname for scoreboard html files public pathname(filename[]){ new path[100] get_pcvar_string(p_stats_path,path,79) format(path,99,"%s%s",path,filename) return path } public get_limit(){ if(get_pcvar_num(p_webmod)) return 0 new url[100] get_pcvar_string(p_stats_url,url,99) if(strlen(url)) return 0 return 1 } public get_url(id,file[]){ new url[100] get_pcvar_string(p_stats_url,url,99) if(get_pcvar_num(p_webmod)){ new ip[10],iip[33],eip[33],port[10] get_user_ip(id,ip,9) get_pcvar_string(p_ip_internal,iip,32) get_pcvar_string(p_ip_external,eip,32) get_pcvar_string(p_port,port,9) if(equal(ip,"192.168.",8))format(url,99,"http://%s:%s/%s",iip,port,file) else format(url,99,"http://%s:%s/%s",eip,port,file) } else if(strlen(url)){ format(url,99,"%sclimb_scores.html",url) } return url } //Show scoreboard public climbscores(id){ if(get_pcvar_num(p_climb)){ new fpn[100],bool:limit=true,cust_msg[129] get_pcvar_string(p_stats_msg,cust_msg,128) if(!get_limit())limit=false fpn=pathname("climb_scores.html") if(get_systime()-score_ts>2){ new fh=fopen(fpn,"w") fprintf(fh,"%s ",limit?"":"") fprintf(fh,"") fprintf(fh,"") //99+144+134=377 new line[251],name[33],players[32],num,tid,writen_len get_players_ordered(players,num) for(new i=1;i<=num;i++){ tid=players[i-1] if(!is_user_hltv(tid)&&is_user_connected(tid)){ get_user_name(tid,name,32) htmlspecialchars(name) formatex(line,250,"",i%2?"":" class='o'",timer[tid][TMR_DBUSER]>0?"y":"n",i,name,getuserstatus(tid),parsetime(getusertime(tid)),timer[tid][TMR_CPSCNT],timer[tid][TMR_GCSCNT],parsetime(timer[tid][TMR_BSTTME]),timer[tid][TMR_BSTGCS],timer[tid][TMR_BSTCPS],timer[tid][TMR_MAPFIN]) writen_len+=strlen(line) if(limit&&writen_len>(1003-strlen(cust_msg)))break fprintf(fh,line) } } //1530-150-377=1003 fprintf(fh,"
Reg#NameStatusTimeCP#GC#BestCP#GC#Completed
%s%d%s%s%s%d%d%s%d%d%d
") fprintf(fh,"climb v%s by: Ian Cammarata%s
",VERSION,cust_msg) fclose(fh) score_ts=get_systime() } if(!limit)fpn=get_url(id,"climb_scores.html") show_motd(id,fpn,"Current Scores") } return PLUGIN_HANDLED } //Show High Scores public highscores(id){ new hsurl[150],mapname[33] get_pcvar_string(p_stats_hsurl,hsurl,149) get_mapname(mapname,32) if(strlen(hsurl)){ formatex(hsurl,149,hsurl,mapname) show_motd(id,hsurl,"High Scores") return PLUGIN_HANDLED } if(get_systime()-hscore_ts>10){ new query[250],data[1] data[0]=id formatex(query,249,"select p.alias, s.fin_time, s.cps, s.gcs, s.fin_cnt from %sscores s, %splayers p where s.map_name='%s' and p.user_id=s.user_id order by s.fin_time, s.gcs, s.cps limit 20;",db_prefix,db_prefix,mapname) SQL_ThreadQuery(db_tuple,"hs_handler",query,data,1) hscore_ts=get_systime() } else{ new fpn[100],bool:limit=true if(!get_limit())limit=false fpn=pathname("climb_highscores.html") if(!limit)fpn=get_url(id,"climb_highscores.html") show_motd(id,fpn,"High Scores") } return PLUGIN_HANDLED } public hs_handler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime){ if(failstate == TQUERY_CONNECT_FAILED) return server_print("Climb: Couldn't connect to database.") else if(failstate == TQUERY_QUERY_FAILED) return server_print("Climb: Query failed: %s",error) if(errnum) return server_print("Climb: Query Error: %s",error) new id=data[0],msg[50],num=SQL_NumResults(query) if(!num){ msg="^x04[Climb] No stats available for the current map." return saytext(id,id,msg) } new fpn[100],bool:limit=true,cust_msg[129] get_pcvar_string(p_stats_msg,cust_msg,128) if(!get_limit())limit=false fpn=pathname("climb_highscores.html") new fh=fopen(fpn,"w") fprintf(fh,"%s ",limit?"":"") fprintf(fh,"") fprintf(fh,"") //99+88+92=279 new name[33],line[151],writen_len for(new i=1;i<=num;i++){ SQL_ReadResult(query,0,name,32) htmlspecialchars(name) formatex(line,150,"",i%2?"":" class='o'",i,name,parsetime(SQL_ReadResult(query,1)),SQL_ReadResult(query,2),SQL_ReadResult(query,3),SQL_ReadResult(query,4)) writen_len+=strlen(line) if(limit&&writen_len>(1101-strlen(cust_msg)))break fprintf(fh,line) SQL_NextRow(query) } //1530-150-279=1101 fprintf(fh,"
#NameTimeCP#GC#Completed
%d%s%s%d%d%d
") fprintf(fh,"climb v %s by: Ian Cammarata%s
",VERSION,cust_msg) fclose(fh) if(!limit)fpn=get_url(id,"climb_highscores.html") show_motd(id,fpn,"High Scores") return PLUGIN_HANDLED } //Convert seconds to time string with zero padded seconds field public parsetime(sec){ new timestr[9],mins mins=sec/60 sec=sec%60 formatex(timestr,8,"%d:%s%d",mins,sec<10?"0":"",sec) return timestr } //Calculate client climb time in seconds public getusertime(id){ new ptime,cflags=timer[id][TMR_CFLAGS] //ptime=timer[id][TMR_FINISH]-timer[id][TMR_STARTD] //if(cflags&CF_STOP&&timer[id][TMR_SESFIN]>0)ptime=ptime<10000?ptime:0 if(cflags&CF_STOP&&timer[id][TMR_SESFIN]>0)ptime=timer[id][TMR_FINISH]-timer[id][TMR_STARTD] else if(cflags&CF_STOP)ptime=0 else if(cflags&CF_START)ptime=get_systime()-timer[id][TMR_STARTD] else if(cflags&CF_PAUSE)ptime=timer[id][TMR_STARTD] return ptime } //Set clock on HUD to current climb time public hudtime(){ if(get_pcvar_num(p_climb)){ new player,players[32],num get_players(players,num,"ac") for(new i=0;i0)msg="Finished" /*else switch(timer[id][TMR_CFLAGS]){ case TMR_CFLAGS_STOP: msg="Not Started" case TMR_CFLAGS_STRT: msg="Climbing" case TMR_CFLAGS_PAUS: msg="Paused" }*/ else if(timer[id][TMR_CFLAGS]&CF_STOP)msg="Not Started" else if(timer[id][TMR_CFLAGS]&CF_START)msg="Climbing" else if(timer[id][TMR_CFLAGS]&CF_PAUSE)msg="Paused" return msg } //Show Hud Message public clmsg(id, msg[]){ set_hudmessage(get_pcvar_num(p_msg_r),get_pcvar_num(p_msg_g),get_pcvar_num(p_msg_b),get_pcvar_float(p_msg_x),get_pcvar_float(p_msg_y),0,0.0,5.0,0.5,0.5,4) show_hudmessage(id,msg) return PLUGIN_HANDLED } //Make client solid public solid(id){ set_user_rendering(id,kRenderFxNone,0,0,0,kRenderNormal,255) entity_set_int(id,EV_INT_solid,SOLID_BBOX) return PLUGIN_CONTINUE } //Make client unsolid public unsolid(id){ if(get_pcvar_num(p_render))set_user_rendering(id,kRenderFxPulseSlow,0,0,0,kRenderTransTexture,50) else set_user_rendering(id,kRenderFxHologram,0,0,0,kRenderTransAdd,0) entity_set_int(id,EV_INT_solid,SOLID_NOT) return PLUGIN_CONTINUE } //Check client solid public playersolid(id){ if(entity_get_int(id,EV_INT_solid)==SOLID_BBOX)return 1 return 0 } //Use in IF statements to automatically print error if false public isalive(id){ if(is_user_alive(id))return 1 clmsg(id,"You must be alive to execute this command.") return 0 } //Use in IF statements to automatically print error if false public notpaused(id){ if(!(timer[id][TMR_CFLAGS]&CF_PAUSE))return 1 clmsg(id,"You can't execute this command while paused.") return 0 } //Used in IF statements a lot public isct(id){ if(get_user_team(id)==2)return 1 return 0 } //Called when client takes damage public damage(id){ new ida[1] ida[0]=id set_task(0.1,"damage_handle",_,ida,1) } //Damage hander, delayed to provide HUD consistency public damage_handle(ida[1]){ new id=ida[0] if(get_pcvar_num(p_climb)&&is_user_alive(id)){ new chp=get_user_health(id) if(chp!=hp){ new wpn,atk=get_user_attacker(id,wpn) //Heal hp immediately if((atk==0||(id==atk&&wpn==0))&&!task_exists(50+id))set_user_health(id,hp) //Heal delayed else{ if(task_exists(50+id))remove_task(50+id) set_task(5.0,"heal",50+id,ida,1) //Fix hp display at 0 if(chp==256)set_user_health(id,257) } } else if(task_exists(50+id))remove_task(50+id) } return PLUGIN_HANDLED } //Heal client to predetermined HP required by map public heal(ida[]){ if(is_user_alive(ida[0]))set_user_health(ida[0],hp) return PLUGIN_HANDLED } public pfn_keyvalue(ent){ static bool:first_run=true new temp_ent if(first_run){ for(new i=0;i<32;i++){ temp_ent=create_entity("info_player_start") if(temp_ent>0){ dyn_spawn_count++ dyn_spawn_ids[dyn_spawn_count]=temp_ent entity_set_int(temp_ent,EV_INT_iuser1,1) //DispatchKeyValue(temp_ent,"origin","0 0 0") //DispatchKeyValue(temp_ent,"angles","0 0 0") } } first_run=false } /*static bool:got_first=false,bool:done=false,first_id,first_orig[21],first_angle[21] new class[26],key[26],val[26] copy_keyvalue(class,25,key,25,val,25) if(equal(class,"info_player_start")&&is_valid_ent(ent)){ if(!done){ if(!got_first){ console_print(0,"DEBUG: Got First") first_id=ent got_first=true } if(got_first&&!done&&ent==first_id){ if(equal(key,"origin"))copy(first_orig,20,val) else if(equal(key,"angles"))copy(first_angle,20,val) if(strlen(first_orig)&&strlen(first_angle)){ done=true console_print(0,"DEBUG: orig:%s angle:%s",first_orig,first_angle) new i,sp for(i=0;i<31;i++){ sp=create_entity("info_player_start") if(ent>0){ entity_set_int(sp,EV_INT_iuser1,1) DispatchKeyValue(sp,"origin",first_orig) DispatchKeyValue(sp,"angles",first_angle) } } } } } if(done&&entity_get_int(ent,EV_INT_iuser1)!=1)remove_entity(ent) }*/ return PLUGIN_CONTINUE } public plugin_cfg(){ //fix timer built into map set_cvar_num("sv_restartround",1) set_cvar_num("sv_gravity",800) new ent,count=0,tmpstr[32],Float:tmpflt get_mapname(tmpstr,32) //map specific fixes : real gravity in nasa maps instead of trigger_push brush. if(equali(tmpstr,"kz_man_nasa")||equali(tmpstr,"kz_man_eznasa")){ remove_entity_name("trigger_push") set_cvar_num("sv_gravity",500) } //Non-Solid check: *trigger_teleport,trigger_once,trigger_gravity,trigger_push //trigger_teleport ent=find_ent_by_class(-1,"trigger_teleport") while(ent>0){ trig[trignum]=ent trignum++ ent=find_ent_by_class(ent,"trigger_teleport") } //trigger_gravity ent=find_ent_by_class(-1,"trigger_gravity") while(ent>0){ trig[trignum]=ent trignum++ ent=find_ent_by_class(ent,"trigger_gravity") } //trigger_once /* ent=find_ent_by_class(-1,"trigger_once") while(ent>0){ trig[trignum]=ent trignum++ ent=find_ent_by_class(ent,"trigger_once") } //trigger_push ent=find_ent_by_class(-1,"trigger_push") while(ent>0){ trig[trignum]=ent trignum++ ent=find_ent_by_class(ent,"trigger_push") }*/ //server_print("***** %d trigger entities found *****",trignum) //Remove neg dmg: *trigger_hurt,*func_door //func_door neg dmg removal ent=find_ent_by_class(-1,"func_door") while(ent>0){ tmpflt=entity_get_float(ent,EV_FL_dmg) if(tmpflt<0){ count++ hp=floatround(tmpflt) remove_entity(ent) ent=-1 } ent=find_ent_by_class(ent,"func_door") } server_print("***** %d neg dmg func_door entities removed *****",count) //trigger_hurt neg dmg removal count=0 ent=find_ent_by_class(-1,"trigger_hurt") while(ent>0){ tmpflt=entity_get_float(ent,EV_FL_dmg) if(tmpflt<0){ count++ hp=floatround(tmpflt) remove_entity(ent) ent=-1 } ent=find_ent_by_class(ent,"trigger_hurt") } server_print("***** %d neg dmg trigger_hurt entities removed *****",count) hp=abs(hp) hp=clamp(hp,100,511) //Healing door trigger button removal count=0 ent=find_ent_by_class(-1,"func_button") while(ent>0){ entity_get_string(ent,EV_SZ_target,tmpstr,32) if(containi(tmpstr,"heal")>-1||containi(tmpstr,"goddoor")>-1){ count++ remove_entity(ent) ent=-1 } ent=find_ent_by_class(ent,"func_button") } server_print("***** %d healing door buttons entities removed *****",count) //func_breakables ent=find_ent_by_class(-1,"func_breakable") while(ent>0){ if(entity_get_int(ent,EV_INT_spawnflags)==2){ brk[brknum]=ent brknum++ } ent=find_ent_by_class(ent,"func_breakable") } server_print("***** %d func_breakable entities found *****",brknum) //Remove unneeded entities if it's a climbing map. count=0 new bool:has_start_button=false,Float:sb_orig[3] ent=find_ent_by_class(-1,"func_button") while(ent>0){ entity_get_string(ent,EV_SZ_target,tmpstr,32) if(equal(tmpstr,"counter_start")||equal(tmpstr,"clockstartbutton")||equal(tmpstr,"firsttimerelay")){ has_start_button=true get_brush_entity_origin(ent,sb_orig) break } ent=find_ent_by_class(ent,"func_button") } if(has_start_button){ remove_entity_name("player_weaponstrip") remove_entity_name("armoury_entity") remove_entity_name("info_player_deathmatch") get_mapname(tmpstr,32) //Health chargers needed for some maps as climbing platforms, don't remove //if(!(equali(tmpstr,"kz_real_skyscraper")||equali(tmpstr,"kz_northpole_b01")))remove_entities("func_healthcharger") count++ //Remove map built in start button sounds ent=find_ent_by_class(-1,"ambient_generic") while(ent>0){ entity_get_string(ent,EV_SZ_targetname,tmpstr,32) if(equal(tmpstr,"counter_start")||equal(tmpstr,"clockstartbutton")||equal(tmpstr,"firsttimerelay")){ remove_entity(ent) } ent=find_ent_by_class(ent,"ambient_generic") } //Count original map spawns and remove extra dyn created spawns new map_spawns[32][2],map_spawns_count,Float:orig[3] ent=find_ent_by_class(-1,"info_player_start") while(ent>0&&map_spawns_count<32){ if(entity_get_int(ent,EV_INT_iuser1)!=1){ entity_get_vector(ent,EV_VEC_origin,orig) map_spawns[map_spawns_count][0]=floatround(vector_distance(orig,sb_orig)) map_spawns[map_spawns_count][1]=ent map_spawns_count++ while(dyn_spawn_count>=0){ entity_get_string(dyn_spawn_ids[dyn_spawn_count],EV_SZ_classname,tmpstr,31) if(equal(tmpstr,"info_player_start")&&entity_get_int(dyn_spawn_ids[dyn_spawn_count],EV_INT_iuser1)==1){ remove_entity(dyn_spawn_ids[dyn_spawn_count]) dyn_spawn_count-- break } else dyn_spawn_count-- } } ent=find_ent_by_class(ent,"info_player_start") } //Save origin of spawn closest to start and arrange all spawn points to positions of the next 4 closest //SortCustom2D(map_spawns,map_spawns_count,"spawn_distance_sort"); SortStrings(map_spawns,map_spawns_count) entity_get_vector(map_spawns[0][1],EV_VEC_origin,spawn_tp_orig) //remove_entity(map_spawns[0][1]) entity_set_vector(map_spawns[0][1],EV_VEC_origin,Float:{0,0,0}) for(new i=5;i=0){ ent=dyn_spawn_ids[dyn_spawn_count] entity_get_string(ent,EV_SZ_classname,tmpstr,31) //entity_get_string(dyn_spawn_ids[i],EV_SZ_classname,tmpstr,31) if(equal(tmpstr,"info_player_start")&&entity_get_int(ent,EV_INT_iuser1)==1)remove_entity(ent) dyn_spawn_count-- } } return PLUGIN_CONTINUE } /*public spawn_distance_sort(elem1[],elem2[]){ if(elem1[1]elem2[1])return 1 return 0 }*/ //Future use, to block hook, or detect hook cheaters a.k.a. hookers public phook(id){ hooked[id]=1 return PLUGIN_CONTINUE } public mhook(id){ hooked[id]=0 return PLUGIN_CONTINUE } //Make a public viewable help page for this on my web host. public climb_help(id){ if(get_pcvar_num(p_climb)){ show_motd(id,"http://ian.cammarata.us/climb/help/2a2/","Climb Plugin Help") } return PLUGIN_HANDLED } public boost_help(id){ if(get_pcvar_num(p_climb)){ show_motd(id,"http://ian.cammarata.us/climb/help/2a2/boost.html","Climb Plugin Help") } return PLUGIN_HANDLED } //Force client to CT public menuteam(id){ if(get_pcvar_num(p_climb))client_cmd(id,"slot2") return PLUGIN_CONTINUE } //Force client to choose random model public menuclass(id){ if(get_pcvar_num(p_climb)){ client_cmd(id,"slot5") } return PLUGIN_CONTINUE } //Used to teleport clients, prevents client collisions and getting stuck public teleport(id,Float:orig[3]){ new Float:c2[3],player,players[32],num get_players(players,num,"ac") unsolid(id) for(new i=0;i-1)return PLUGIN_CONTINUE } //Remove slashes if(equal(cmd,"/",1)||equal(cmd,"\",1)||equal(cmd,".",1)||equal(cmd,"!",1))copy(cmd,20,cmd[1]) //Make a checkpoint if(equali(cmd,"checkpoint")||equali(cmd,"check")||equali(cmd,"cp"))check(id) //Go to checkpoint else if(equali(cmd,"gocheck")||equali(cmd,"gc")||equali(cmd,"tp")||equali(cmd,"tele"))gocheck(id) //Boost help page else if(equali(cmd,"boost"))boost_help(id) //Solid Boost else if(equali(cmd,"solid")||equali(cmd,"semiclip"))change_boost(id,CF_SOLID) //Jump Boost else if(equali(cmd,"superjump")||equali(cmd,"sjump")||equali(cmd,"sj")||equali(cmd,"longjump")||equali(cmd,"ljump")||equali(cmd,"lj"))change_boost(id,CF_SUPER_JUMP) //Double Jump Boost else if(equali(cmd,"doublejump")||equali(cmd,"djump")||equali(cmd,"dj"))change_boost(id,CF_DOUBLE_JUMP) //Stuck else if(equali(cmd,"stuck")||equali(cmd,"unstuck"))stuck(id) //Pause else if(equali(cmd,"pause")||equali(cmd,"unpause"))change_status(id,CF_PAUSE) //Restart else if(equali(cmd,"restart")||equali(cmd,"reset"))reset(id) //Stop else if(equali(cmd,"stop"))stop(id) //Time/Scores else if(equali(cmd,"scoreboard")||equali(cmd,"score")||equali(cmd,"scores"))climbscores(id) //Top Scores else if(equali(cmd,"top10")||equali(cmd,"top15")||equali(cmd,"top")||equali(cmd,"highscores")||equali(cmd,"best")||equali(cmd,"rank"))highscores(id) //Respawn else if(equali(cmd,"respawn")||equali(cmd,"spawn"))frespawn(id) //Spectate else if(equali(cmd,"spectate")||equali(cmd,"spec"))spectate(id) //Climb Help else if(equali(cmd,"help")||equali(cmd,"climbhelp")||equali(cmd,"kzhelp"))climb_help(id) //If none of above conditions met, don't block the command else return PLUGIN_CONTINUE return PLUGIN_HANDLED } public donothing(){ return PLUGIN_CONTINUE } public regwarn(id){ if(timer[id][TMR_DBUSER]<1){ saytext(id,id,"^x04You must register/login for your stats to save. Say /help for more info.") return 1 } return 0 } public db_init(){ //update from old db version //alter table climb_scores add boosts int //alter table climb_scores add wpns int //alter table climb_scores add score int //update climb_scores set boosts=-1 //update climb_scores set wpns=-1 static host[32],user[32],pass[32],name[32],type[12] get_cvar_string("climb_db_host",host,31) get_cvar_string("climb_db_user",user,31) get_cvar_string("climb_db_pass",pass,31) get_cvar_string("climb_db_name",name,31) get_cvar_string("climb_db_type",type,11) get_cvar_string("climb_db_prefix",db_prefix,31) //SQL_SetAffinity(type) db_tuple=SQL_MakeDbTuple(host,user,pass,name) new query[600] formatex(query,599,"\ create table %splayers (\ user_id integer primary key autoincrement,\ steam_id char(25) unique,\ password char(6),\ user_name varchar(20) unique,\ alias varchar(32) unique,\ email varchar(50) unique,\ cflags integer);\ ",db_prefix) SQL_ThreadQuery(db_tuple,"db_generic_handler",query) formatex(query,599,"\ create table %sscores (\ score_id integer primary key autoincrement,\ score integer,\ server_ip char(15),\ user_id integer,\ map_name varchar(32),\ fin_time integer,\ cps integer,\ gcs integer,\ fin_cnt integer,\ boosts integer,\ wpns integer,\ server_time_stamp integer);\ create unique index scores_usermap_idx on %sscores (user_id, map_name);\ create index scores_score on %sscores (score);\ ",db_prefix,db_prefix,db_prefix) SQL_ThreadQuery(db_tuple,"db_generic_handler",query) formatex(query,599,"\ create table %ssessions (\ steam_id char(25) primary key,\ user_id integer unique);\ ",db_prefix) SQL_ThreadQuery(db_tuple,"db_generic_handler",query) return PLUGIN_HANDLED } public db_generic_handler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime){ if(failstate == TQUERY_CONNECT_FAILED) return server_print("Climb: Couldn't connect to database.") else if(failstate == TQUERY_QUERY_FAILED) return server_print("Climb: Query failed: %s",error) if(errnum) return server_print("Climb: Query Error: %s",error) return PLUGIN_HANDLED } public logout(id){ for(new i=0;i<8;i++)origins[id][i]=0.0 for(new i=0;i<11;i++)timer[id][i]=0 } public login(id){ if(get_pcvar_num(p_climb)){ if(climb_save){ if(timer[id][TMR_DBUSER]>0){//Already logged in client_print(id,print_console,"[Climb] Login Error: You are already logged in.") return PLUGIN_HANDLED } new query[99],data[28] data[0]=id if(read_argc()>1){//Client is logging in with a user/pass new user[21],pass[21] read_argv(1,user,20) read_argv(2,pass,20) rotwtf(pass,6) data[1]=1 formatex(query,98,"select user_id from %splayers where user_id='%s' and password='%s';",db_prefix,user,pass) formatex(data[2],25,user) SQL_ThreadQuery(db_tuple,"login_handler",query,data,28) } else{//Client is logging in with SteamID new sid[26] get_user_authid(id,sid,25) data[1]=2 formatex(query,98,"select user_id, password from %splayers where steam_id='%s';",db_prefix,sid) formatex(data[2],25,sid) SQL_ThreadQuery(db_tuple,"login_handler",query,data,28) } } else client_print(id,print_console,"[Climb] Login Error: Can't Login; Stats not enabled.") } return PLUGIN_HANDLED } public login_handler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime){ new id=data[0] if(failstate == TQUERY_CONNECT_FAILED) return server_print("Climb: Couldn't connect to database.") else if(failstate == TQUERY_QUERY_FAILED) return server_print("Climb: Query failed: %s",error) if(errnum) return server_print("Climb: Query Error: %s",error) if(SQL_NumResults(query)<1) return client_print(id,print_console,"[Climb] Login Error: Not a valid account.") if(data[1]==2){ new pass[7] SQL_ReadResult(query,1,pass,6) if(equali(pass,"shared")){ client_print(id,print_console,"[Climb] Login Error: You are using a shared SteamID. Please login with a username and password.") return PLUGIN_HANDLED } } timer[id][TMR_DBUSER]=SQL_ReadResult(query,0) new msg[100] formatex(msg,99,"[Climb] Login: Success - Account: %s",data[2]) client_print(id,print_console,msg) format(msg,99,"^x04%s",msg) saytext(id,id,msg) db_load(id) return PLUGIN_HANDLED } public db_load(id){ new query[150],mapname[33],data[1] data[0]=id get_mapname(mapname,32) formatex(query,149,"select fin_time, cps, gcs, fin_cnt from %sscores where user_id=%d and map_name='%s';",db_prefix,timer[id][TMR_DBUSER],mapname) SQL_ThreadQuery(db_tuple,"db_load_handler",query,data,1) return PLUGIN_HANDLED } public db_load_handler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime){ if(failstate == TQUERY_CONNECT_FAILED) return server_print("Climb: Couldn't connect to database.") else if(failstate == TQUERY_QUERY_FAILED) return server_print("Climb: Query failed: %s",error) if(errnum) return server_print("Climb: Query Error: %s",error) new msg[100],id=data[0] if(!SQL_NumResults(query)) msg="^x04No stats available for this account on the current map." else{ new mapname[33],timestr[9] get_mapname(mapname,32) timer[id][TMR_BSTTME]=SQL_ReadResult(query,0) timer[id][TMR_BSTCPS]=SQL_ReadResult(query,1) timer[id][TMR_BSTGCS]=SQL_ReadResult(query,2) timer[id][TMR_MAPFIN]=SQL_ReadResult(query,3) timestr=parsetime(timer[id][TMR_BSTTME]) formatex(msg,99,"^x04Stats loaded for %s - %s^t(%d CPS/ %d GCS)^tCompleted %d",mapname,timestr,timer[id][TMR_BSTCPS],timer[id][TMR_BSTGCS],timer[id][TMR_MAPFIN]) } saytext(id,id,msg) return PLUGIN_HANDLED } public db_save(id){ new query[150],name[33] get_mapname(name,32) if(timer[id][TMR_MAPFIN]==1) formatex(query,149,"insert into %sscores (user_id, map_name, fin_time, cps, gcs, fin_cnt)\ values (%d, '%s', %d, %d, %d, %d);\ ",db_prefix,timer[id][TMR_DBUSER],name,timer[id][TMR_BSTTME],timer[id][TMR_BSTCPS],timer[id][TMR_BSTGCS],timer[id][TMR_MAPFIN]) else formatex(query,149,"update %sscores set fin_time=%d, cps=%d, gcs=%d, fin_cnt=%d where user_id=%d and map_name='%s';",db_prefix,timer[id][TMR_BSTTME],timer[id][TMR_BSTCPS],timer[id][TMR_BSTGCS],timer[id][TMR_MAPFIN],timer[id][TMR_DBUSER],name) SQL_ThreadQuery(db_tuple,"db_save_handler",query) get_user_name(id,name,32) formatex(query,149,"update %splayers set alias='%s' where user_id=%d;",db_prefix,name,timer[id][TMR_DBUSER]) SQL_ThreadQuery(db_tuple,"db_save_handler",query) return PLUGIN_HANDLED } public db_save_handler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime){ if(failstate == TQUERY_CONNECT_FAILED) return server_print("Climb: Couldn't connect to database.") else if(failstate == TQUERY_QUERY_FAILED) return server_print("Climb: Query failed: %s",error) if(errnum) return server_print("Climb: Query Error: %s",error) return PLUGIN_HANDLED } public reg(id){ if(get_pcvar_num(p_climb)){ if(climb_save){ new query[100],sid[26],name[33],data[43] data[0]=id data[1]=0 get_user_authid(id,sid,25) get_user_name(id,name,32) //Register user/pass if(read_argc()>1){ if(read_argc()!=3){ client_print(id,print_console,"[Climb] Registration Error: Invalid number of arguments") return PLUGIN_HANDLED } new user[21],pass[50] //Read password and check length read_argv(2,pass,20) if(strlen(pass)<10){ client_print(id,print_console,"[Climb] Registration Error: Password must be at least 10 characters.") return PLUGIN_HANDLED } //Read user read_argv(1,user,20) //Store user/pass in data array to pass to handler for autologin formatex(data[2],20,user) formatex(data[22],20,pass) //Create password hash rotwtf(pass,6) //Register shared SteamID formatex(query,99,"insert into %splayers (steam_id,password) values ('%s','shared')",db_prefix,sid) SQL_ThreadQuery(db_tuple,"reg_handler",query,data,43) //Register user/pass data[1]=1 formatex(query,99,"insert into %splayers (user_name,password,alias) values ('%s','%s','%s')",db_prefix,user,pass,name) SQL_ThreadQuery(db_tuple,"reg_handler",query,data,43) } //Else register SteamID else{ data[1]=2 formatex(query,99,"insert into %splayers (steam_id,alias) values ('%s','%s')",db_prefix,sid,name) SQL_ThreadQuery(db_tuple,"reg_handler",query,data,43) } } else client_print(id,print_console,"[Climb] Registration Error: Can't Register; Stats not enabled.") } return PLUGIN_HANDLED } public reg_handler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime){ new id=data[0],flag=data[1],user[21],pass[21] format(user,20,data[2]) format(pass,20,data[22]) if(failstate == TQUERY_CONNECT_FAILED) return server_print("[Climb] Couldn't connect to database.") else if(failstate == TQUERY_QUERY_FAILED) return server_print("[Climb] Query failed: %s",error) if(errnum){ client_print(id,print_console,"[Climb] Registration Error: Database error, please notify the server admin.") return server_print("[Climb] Query Error: %s",error) } if(flag==0)client_print(id,print_console,"[Climb] Recorded shared SteamID.") else{ client_print(id,print_console,"[Climb] Registration Successful.") new cmd[50] formatex(cmd,49,"login %s %s",user,pass) client_cmd(id,cmd) } return PLUGIN_HANDLED } public rotwtf(string[],out_len){ new len=strlen(string),str[99],cnt=0,tok=len-1 copy(str,out_len,string) for(new index=0;index<11;index++){ if('a'<=string[index]<='z') str[index]=(str[index]-'a'+string[tok]+index) else if('A'<=str[index]<='Z') str[index]=(str[index]-'A'+string[tok]+index) else if('0'<=str[index]<='9') str[index]=(str[index]-'0'+string[tok]+index) switch(cnt){ case 0:str[index]=str[index]%26+'a' case 1:str[index]=str[index]%26+'A' case 2:str[index]=str[index]%10+'0' } tok-- if(tok<0)tok=len-1 cnt++ if(cnt==3)cnt=0 } copy(string,out_len,str) return PLUGIN_HANDLED } public plugin_init(){ register_plugin("Climb",VERSION,"Ian Cammarata") register_cvar("climb_version",VERSION,FCVAR_SERVER) p_climb= register_cvar("climb","1",FCVAR_SERVER) p_boost= register_cvar("climb_boost","1") p_cpprice=register_cvar("climb_cpprice","0") register_cvar("climb_save","1") register_cvar("climb_db_type","sqlite") register_cvar("climb_db_host","127.0.0.1") register_cvar("climb_db_user","") register_cvar("climb_db_pass","") register_cvar("climb_db_name","climb") register_cvar("climb_db_prefix","climb_") p_msg_r=register_cvar("climb_msg_r","0") p_msg_g=register_cvar("climb_msg_g","150") p_msg_b=register_cvar("climb_msg_b","250") p_msg_x=register_cvar("climb_msg_x","0.05") p_msg_y=register_cvar("climb_msg_y","0.5") p_sounds=register_cvar("climb_sounds","1") p_render=register_cvar("climb_unsolid_type","0") p_ip_internal=register_cvar("ip_internal","localhost") p_ip_external=register_cvar("ip_external","localhost") p_port=get_cvar_pointer("port") p_webmod=register_cvar("climb_webmod","0") p_stats_path= register_cvar("climb_stats_path","") p_stats_url= register_cvar("climb_stats_url","") p_stats_hsurl= register_cvar("climb_stats_hsurl","") //Use %s in place of map name p_stats_msg= register_cvar("climb_stats_msg","") p_allow_spectators=get_cvar_pointer("allow_spectators") p_startmoney= register_cvar("climb_startmoney","1337") //General Client Commands //These commands get blocked always. register_clcmd("fullupdate","block_cmd2") //These commands get blocked when climb is enabled. register_clcmd("chooseteam","block_cmd") register_clcmd("buy","block_cmd") register_clcmd("buyammo1","block_cmd") register_clcmd("buyammo2","block_cmd") register_clcmd("buyequip","block_cmd") register_clcmd("jointeam","block_jointeam") //Commands to detect cheats. register_clcmd("+hook","phook") register_clcmd("+rope","phook") register_clcmd("-hook","mhook") register_clcmd("-rope","mhook") //Commands referencing function 'donothing' are picked up by the more flexible code in the client_command forward. register_clcmd("climbhelp","donothing",0,"- Veiw climb help.") register_clcmd("cp","donothing",_,"- Make a checkpoint") register_clcmd("gc","donothing",_,"- Teleport to last checkpoint") register_clcmd("stuck","donothing",_,"- Teleport to previous checkpoint") register_clcmd("restart","donothing",_,"- Stop and respawn.") register_clcmd("stop","donothing",_,"- End current climbing run.") register_clcmd("pause","donothing",_,"- Pause yourself.") register_clcmd("scoreboard","donothing",_,"- View score board.") register_clcmd("respawn","donothing",_,"- Force respawn") register_clcmd("boost","donothing",_,"- Boost.") register_clcmd("spec","donothing",_,"- Spectate mode.") //Commands related to stats account system. register_clcmd("register","reg",_,"- (Console Only) Register for stats tracking.") register_clcmd("login","login",_,"- (Console Only) Login to stats account.") //Admin Commands register_clcmd("amx_goto","goto_player",ADMIN_SLAY) //For scoreboard backend //register_srvcmd("amx_climb_sbrefresh","htmlscoreboard") //Events register_event("DeathMsg","death_msg","a") register_event("ResetHUD","spawned","b") //register_event("Damage","damage","b") register_event("Health","damage","b") register_event("ShowMenu","menuclass","b","4&CT_Select","4&Terrorist_Select") register_event("ShowMenu","menuteam","b","4&Team_Select_Spect","4&Team_Select","4&IG_Team_Select") //Init DB if(get_cvar_num("climb_save"))climb_save=true if(climb_save)db_init() //Init anti flood time stamps score_ts=get_systime() hscore_ts=get_systime() //Task to update time on clients HUD; Task set for half second to minimize flickering of the timer. set_task(0.5,"hudtime",_,_,_,"b") //Register FakeMeta Traceline forward. register_forward(FM_TraceLine, "traceline", 1) //Load Start/Finish Commands new ini[50] get_configsdir(ini,49) format(ini,49,"%s/climb.ini",ini) if(file_exists(ini)){ new line=0,text[50],len while(read_file(ini,line++,text,sizeof(text)-1,len)){ if(!equal(text,";",1)&&!equal(text,"#",1)&&!equal(text,"//",2)){ if(sfcount #include new hookflag[32],toggleflag[32],custompassmsg[47]="You must finish the map before you get a hook." public client_putinserver(id){ toggleflag[id]=0 hookflag[id]=0 new ida[1] ida[0]=id if(get_user_flags(id)&ADMIN_SLAY)set_task(2.0,"adminhook",0,ida,1) return PLUGIN_CONTINUE } public adminhook(ida[]){ new id=ida[0] hookflag[id]=0 server_cmd("amx_givehook #%d",get_user_userid(id)) return PLUGIN_HANDLED } public givehook(id,level,cid){ if(cmd_access(id,level,cid,2)){ new arg[32],player,name[32] read_argv(1,arg,31) player=cmd_target(id,arg,8) if(player&&hookflag[player]==0){ get_user_name(player,name,32) new pass[32] get_cvar_string("df_hook_password",pass, 32) client_cmd(player,"hook_login ^"%s^"",pass) client_print(player,print_chat,"[AMX] : You have recieved hook privileges.") client_print(id,print_console,"[AMX] : %s - hook privileges recieved.",name) hookflag[player]=1 } } return PLUGIN_HANDLED } public revokehook(id,level,cid){ if(cmd_access(id,level,cid,2)){ new arg[32],player,name[32] read_argv(1,arg,31) player=cmd_target(id,arg,8) if(player&&hookflag[player]==1){ get_user_name(player,name,32) client_cmd(player,"-hook") client_cmd(player,"hook_login ^"^"") client_print(player,print_chat,"[AMX] : You have lost hook privileges.") client_print(id,print_console,"[AMX] : %s - hook privileges revoked.",name) hookflag[player]=0 } } return PLUGIN_HANDLED } public banhook(id,level,cid){ if(cmd_access(id,level,cid,2)){ new arg[32],player,name[32] read_argv(1,arg,31) player=cmd_target(id,arg,8) if(player){ get_user_name(player,name,32) client_cmd(player,"hook_login ^"^"") client_print(player,print_chat,"[AMX] : You have been banned from using hook.") client_print(id,print_console,"[AMX] : %s - has been banned from using hook.",name) hookflag[player]=2 } } return PLUGIN_HANDLED } public unbanhook(id,level,cid){ if(cmd_access(id,level,cid,2)){ new arg[32],player,name[32] read_argv(1,arg,31) player=cmd_target(id,arg,8) if(player&&hookflag[player]==2){ get_user_name(player,name,32) //client_cmd(player,"hook_login ^"^"") client_print(player,print_chat,"[AMX] : You have been unbanned for hook privileges.") client_print(id,print_console,"[AMX] : %s - has been unbanned for hook privileges.",name) hookflag[player]=0 } } return PLUGIN_HANDLED } public phook(id){ toggleflag[id]=1 if(!hookflag[id]){ new ida[1] ida[0]=id set_task(0.1,"custmsg",0,ida,1) } return PLUGIN_HANDLED } public mhook(id){ toggleflag[id]=0 return PLUGIN_CONTINUE } public custmsg(ida[]){ client_print(ida[0],print_center,custompassmsg) return 1 } public tog(id){ if(toggleflag[id])client_cmd(id, "-hook") else{ client_cmd(id, "+hook") if(!hookflag[id])client_cmd(id, "-hook") } return PLUGIN_HANDLED } public plugin_init(){ register_plugin("DF_Hook Frontend","1.0.1","Don Juan-jello") register_concmd("amx_givehook","givehook",ADMIN_SLAY,"") register_concmd("amx_revokehook","revokehook",ADMIN_SLAY,"") register_concmd("amx_banhook","banhook",ADMIN_SLAY,"") register_concmd("amx_unbanhook","unbanhook",ADMIN_SLAY,"") register_clcmd("togglehook","tog",0,"- Toggle hook on and off.") register_clcmd("+hook","phook",0) register_clcmd("-hook","mhook",0) return PLUGIN_CONTINUE }Xt9 ;0amxmodx\scripting\includeWtFnG60& amxmodx\scripting\include\cstrike2.inc/*Cstrike Stocks 2 * Version 0.1.2 * * by Don Juan-jello * www.jello-net.com * * This file is provided as is (no warranties). */ #if defined _cstrike2_included #endinput #endif #define _cstrike2_included //Set whether play has shield stock cs_set_user_shield(id,onoff=1){ if(onoff)set_offset_int(id,510,(1<<24)) else set_offset_int(id,510,0) return 1 } // Set Score Attribute // 0 nothing // 1 dead // 2 bomb // 4 vip stock cs_set_user_scoreattrib(id,attrib=0){ message_begin(2,get_user_msgid("ScoreAttrib"),{0,0,0},0) write_byte(id) write_byte(attrib) message_end() } // Radio and chat strings can have control characters embedded to set colors. For the control characters to be used, one must be at the start of the string. // The control characters can be copied and pasted in notepad. // 0x02 (STX) - Use team color up to the end of the player name. This only works at the start of the string, and precludes using the other control characters. // 0x03 (ETX) - Use team color from this point forward // 0x04 (EOT) - Use location color from this point forward // 0x01 (SOH) - Use normal color from this point forward // Sample string "^x03Team colored text ^x01Normal color" public saytext(sndr,rcvr,txt[]){ message_begin(1,get_user_msgid("SayText"),{0,0,0},rcvr) write_byte(sndr) write_string(txt) message_end() return PLUGIN_CONTINUE } public saytextall(sndr,txt[]){ message_begin(2,get_user_msgid("SayText"),{0,0,0},0) write_byte(sndr) write_string(txt) message_end() return PLUGIN_CONTINUE } //Be sure to pass this function the text without any color codes in it. stock saytextlog(sndr,txt[],saytype[]="say"){ if(sndr>0){ new name[32],steam[20],team[10] get_user_name(sndr,name,31) get_user_authid(sndr,steam,19) get_user_team(sndr,team,9) log_message("^"%s<%d><%s><%s>^" %s ^"%s^"%s",name,get_user_userid(sndr),steam,team,saytype,txt,is_user_alive(sndr)?"":" (dead)") } else log_message("Server say ^"%s^"",txt) return PLUGIN_CONTINUE } stock weaponstrip(id,noknife=0){ new ent=create_entity("player_weaponstrip") DispatchSpawn(ent) entity_use(ent,id) if(!noknife)give_item(id,"weapon_knife") remove_entity(ent) set_offset_int(id,116,0) return 1 } otE\?G60% amxmodx\scripting\include\string2.inc/*Additional String manipulation * Version 0.1 * * by Don Juan-jello * * This file is provided as is (no warranties). */ #if defined _string2_included #endinput #endif #define _string2_included //Replace HTML Special Characters with Entity References stock htmlspecialchars(string[]){ replace(string,512,"&","&") replace(string,512,"<","<") replace(string,512,">",">") return 1 } //Makes an HTTP:// URL stock httpurl(string[]){ format(string,512,"HREF=^"http:/%s%s^"","/",string) return 1 }`t <rsz١ ;3 ன.txt`v  [ށ~ l? 9cn_N.AЖOOk|/݂06(EMJW|/۩8O|l(V,(91//=__7OGgNί۴O>_+qǟ?`lڬL,  /;eV}OyiJRCʷ@[CeE<@9Oqlp1üw7a*z>ҒO[%TBIc6u{}/&-6I,#WMAK$f:@(gUx΃B.E Ac[R\m=h eն}jJD*u_3 0ڀd|&6s @'p| m%4:pA,^EVЃb "mđ"@嵷SEA YOo(\^>!&#Co>[E(|Jyʚe&DND2aSO| i0jN(ζS [I.yw?gϻk&Ms/̟0.kpo;!eoHaX[~38.s9Sa.eEN\SncN/T< xp,Y.̑+l!W?%颺{ ţ"..E 2bXqs `ьf*q0'R2y_)|8Rr[j3E}G,.kO-ˆ^L65CwوǼ 9ZNy*>}@3-MPf$}gh6d`m*a- Ƹ5w:Wv}0;݄alR>H={@